From f5b2193ba1a3918b66b3534dba04d2fb760f3cff Mon Sep 17 00:00:00 2001 From: Alireza Hassani Date: Wed, 29 Jul 2026 16:10:43 +0330 Subject: [PATCH] Improve product cards/pagination, Farsi locale fonts, and super-admin migrate UI. Co-authored-by: Cursor --- .../fonts/iranyekan/IRANYekanWebLight.ttf | Bin 0 -> 60524 bytes .../fonts/iranyekan/IRANYekanWebRegular.ttf | Bin 0 -> 59452 bytes .../src/components/AddCustomerModal.tsx | 5 +- .../src/components/AddProductByAiModal.tsx | 5 +- .../src/components/AddVariationModal.tsx | 6 +- .../components/AddWebsiteSliderSlideModal.tsx | 5 +- .../src/components/BlogCard.module.css | 17 + apps/business/src/components/BlogCard.tsx | 28 +- .../src/components/BlogCategoryRow.tsx | 18 +- .../src/components/BlogCategoryTree.tsx | 4 + .../src/components/BlogCommentsModal.tsx | 5 +- apps/business/src/components/BrandModal.tsx | 5 +- .../src/components/CategoryAiPromptModal.tsx | 5 +- .../business/src/components/CategoryModal.tsx | 5 +- apps/business/src/components/CategoryRow.tsx | 2 +- .../src/components/CategoryTree.module.css | 3 + .../src/components/ConfirmDeleteModal.tsx | 5 +- .../ContactSubmissionDetailModal.tsx | 5 +- .../components/CreateProductVariantModal.tsx | 5 +- .../src/components/CreateStoreItemsModal.tsx | 5 +- .../src/components/EditCustomerModal.tsx | 5 +- .../src/components/EditStoreItemsModal.tsx | 5 +- .../business/src/components/ImageLightbox.tsx | 5 +- .../src/components/OrderItemsModal.tsx | 5 +- .../src/components/OrderStepModal.tsx | 5 +- .../src/components/OrderTransactionsModal.tsx | 5 +- .../src/components/PageContent.module.css | 18 +- .../src/components/Pagination.module.css | 61 -- apps/business/src/components/Pagination.tsx | 54 +- .../components/PickStoreSpecialItemsModal.tsx | 5 +- .../src/components/PickStoreVariantModal.tsx | 5 +- .../src/components/PickWebsiteBrandsModal.tsx | 5 +- .../components/PickWebsiteCategoriesModal.tsx | 5 +- .../src/components/PortfolioCard.module.css | 45 +- .../business/src/components/PortfolioCard.tsx | 42 +- .../src/components/PortfolioCommentsModal.tsx | 5 +- .../src/components/ProductCard.module.css | 2 + .../src/components/ProductCommentsModal.tsx | 5 +- .../components/ProductTechnicalInfoModal.tsx | 5 +- .../src/components/ProductVariantsModal.tsx | 5 +- .../components/SearchableSelect.module.css | 1 + .../src/components/ShoppingCartModal.tsx | 5 +- .../src/components/StoreItemCard.module.css | 1 + .../src/components/StoreItemDiscountModal.tsx | 5 +- .../src/components/StoreItemFestivalModal.tsx | 5 +- .../src/components/StoreSpecialModal.tsx | 14 +- .../components/TechnicalFormAiPromptModal.tsx | 160 +++++ .../components/TechnicalFormModal.module.css | 1 + .../src/components/TechnicalFormModal.tsx | 11 +- .../src/components/VariationsModal.module.css | 18 +- .../src/components/VariationsModal.tsx | 41 +- .../WebsiteGroupItemCard.module.css | 3 + apps/business/src/data/products.ts | 2 +- apps/business/src/fonts/iranyekan.css | 28 +- apps/business/src/index.css | 9 +- .../src/pages/AddNewPortfolioPage.tsx | 52 +- .../src/pages/AddNewProductPage.module.css | 11 + .../business/src/pages/BlogCategoriesPage.tsx | 11 + apps/business/src/pages/BlogDetailsPage.tsx | 36 +- apps/business/src/pages/CategoriesPage.tsx | 22 +- .../src/pages/CustomersPage.module.css | 19 +- apps/business/src/pages/CustomersPage.tsx | 91 ++- .../src/pages/MyProductsPage.module.css | 19 + apps/business/src/pages/MyProductsPage.tsx | 18 +- apps/business/src/pages/OrdersPage.module.css | 12 +- apps/business/src/pages/OrdersPage.tsx | 49 +- .../src/pages/PortfolioCategoriesPage.tsx | 11 + apps/business/src/pages/PortfolioListPage.tsx | 2 +- .../src/pages/ProductDetailsPage.module.css | 22 +- .../business/src/pages/ProductDetailsPage.tsx | 71 ++- apps/business/src/pages/ShoppingCardsPage.tsx | 49 +- .../src/pages/WebsiteContactPage.module.css | 8 +- .../business/src/pages/WebsiteContactPage.tsx | 49 +- .../business/src/services/portfolioService.ts | 17 +- apps/business/src/services/productService.ts | 2 +- apps/business/src/types/portfolio.ts | 2 + apps/business/src/utils/textLocale.ts | 22 + .../src/components/OrderItemsModal.tsx | 5 +- apps/customer/src/pages/FavoritesPage.tsx | 27 +- apps/customer/src/pages/OrdersPage.tsx | 50 +- .../fonts/iranyekan/IRANYekanWebLight.ttf | Bin 0 -> 60524 bytes .../fonts/iranyekan/IRANYekanWebRegular.ttf | Bin 0 -> 59452 bytes apps/super-admin/src/App.tsx | 75 ++- .../src/components/AdminDomainGuard.tsx | 7 +- .../components/ConfirmDeleteModal.module.css | 8 +- .../src/components/ConfirmDeleteModal.tsx | 13 +- .../src/components/Modal.module.css | 7 +- apps/super-admin/src/components/Modal.tsx | 25 +- .../src/components/RouteErrorBoundary.tsx | 56 ++ apps/super-admin/src/fonts/iranyekan.css | 28 +- .../src/pages/BusinessInvoicesPage.module.css | 68 ++- .../src/pages/BusinessInvoicesPage.tsx | 158 +++-- .../src/pages/BusinessesPage.module.css | 145 +++++ apps/super-admin/src/pages/BusinessesPage.tsx | 572 ++++++++++++++++-- .../src/pages/IssueInvoicePage.tsx | 151 +++-- .../src/pages/PublicInvoicePage.module.css | 58 ++ apps/super-admin/src/pages/UsersPage.tsx | 110 ++-- apps/super-admin/src/pages/WebsitesPage.tsx | 61 +- .../src/services/businessService.ts | 34 +- .../src/services/invoiceService.ts | 21 + apps/super-admin/src/types/business.ts | 61 ++ apps/super-admin/src/types/invoice.ts | 12 +- apps/super-admin/src/utils/invoiceDraft.ts | 65 ++ docs/PROJECT_CONTEXT.md | 8 +- .../src/components/Pagination.module.css | 13 +- .../src/components/Pagination.tsx | 64 +- .../src/components/PasswordResetModal.tsx | 6 +- packages/dashboard-ui/src/index.ts | 1 + 108 files changed, 2421 insertions(+), 812 deletions(-) create mode 100755 apps/business/public/fonts/iranyekan/IRANYekanWebLight.ttf create mode 100755 apps/business/public/fonts/iranyekan/IRANYekanWebRegular.ttf delete mode 100644 apps/business/src/components/Pagination.module.css create mode 100644 apps/business/src/components/TechnicalFormAiPromptModal.tsx create mode 100644 apps/business/src/utils/textLocale.ts create mode 100755 apps/super-admin/public/fonts/iranyekan/IRANYekanWebLight.ttf create mode 100755 apps/super-admin/public/fonts/iranyekan/IRANYekanWebRegular.ttf create mode 100644 apps/super-admin/src/components/RouteErrorBoundary.tsx diff --git a/apps/business/public/fonts/iranyekan/IRANYekanWebLight.ttf b/apps/business/public/fonts/iranyekan/IRANYekanWebLight.ttf new file mode 100755 index 0000000000000000000000000000000000000000..4431c6f02629a2e6a66b9ea3a7b499fbaad7f1d9 GIT binary patch literal 60524 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 literal 0 HcmV?d00001 diff --git a/apps/business/src/components/AddCustomerModal.tsx b/apps/business/src/components/AddCustomerModal.tsx index 0b68894..a32b409 100644 --- a/apps/business/src/components/AddCustomerModal.tsx +++ b/apps/business/src/components/AddCustomerModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { toE164CellNumber } from '../lib/cellNumber' @@ -96,7 +97,7 @@ export function AddCustomerModal({ open, onClose, onCreated }: AddCustomerModalP } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/AddProductByAiModal.tsx b/apps/business/src/components/AddProductByAiModal.tsx index 30ea18b..823c318 100644 --- a/apps/business/src/components/AddProductByAiModal.tsx +++ b/apps/business/src/components/AddProductByAiModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { Sparkles, X } from 'lucide-react' import { useToast } from '../context/ToastContext' import { ApiError } from '../lib/api' @@ -123,7 +124,7 @@ export function AddProductByAiModal({ if (!mounted) return null - return ( + return createPortal(
e.target === e.currentTarget && !isSubmitting && onClose()} @@ -230,5 +231,7 @@ export function AddProductByAiModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/AddVariationModal.tsx b/apps/business/src/components/AddVariationModal.tsx index 19323e4..3f51c2b 100644 --- a/apps/business/src/components/AddVariationModal.tsx +++ b/apps/business/src/components/AddVariationModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { Plus, X } from 'lucide-react' import type { Variation, VariationType } from '../types/variation' import { COLOR_OPTIONS, SIZE_OPTIONS } from '../types/variation' @@ -114,7 +115,7 @@ export function AddVariationModal({ open, onClose, onSubmit }: AddVariationModal ? selectedSizes.length > 0 : customValues.some((v) => v.trim()) - return ( + return createPortal(
- + , + document.body, ) } diff --git a/apps/business/src/components/AddWebsiteSliderSlideModal.tsx b/apps/business/src/components/AddWebsiteSliderSlideModal.tsx index d1761d3..fbfc751 100644 --- a/apps/business/src/components/AddWebsiteSliderSlideModal.tsx +++ b/apps/business/src/components/AddWebsiteSliderSlideModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ImageCropper } from './ImageCropper' import modalStyles from './CategoryModal.module.css' @@ -70,7 +71,7 @@ export function AddWebsiteSliderSlideModal({ }) } - return ( + return createPortal(
e.target === e.currentTarget && onClose()} @@ -149,5 +150,7 @@ export function AddWebsiteSliderSlideModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/BlogCard.module.css b/apps/business/src/components/BlogCard.module.css index 7cbea6a..a686af7 100644 --- a/apps/business/src/components/BlogCard.module.css +++ b/apps/business/src/components/BlogCard.module.css @@ -91,6 +91,7 @@ } .title { + margin: 0; font-size: 15px; font-weight: 600; line-height: 1.4; @@ -102,6 +103,14 @@ overflow: hidden; } +.title[dir='rtl'] { + text-align: right; +} + +.title[dir='ltr'] { + text-align: left; +} + .abstract { margin: 0; font-size: 13px; @@ -113,6 +122,14 @@ overflow: hidden; } +.abstract[dir='rtl'] { + text-align: right; +} + +.abstract[dir='ltr'] { + text-align: left; +} + .meta { margin: 0; font-size: 12px; diff --git a/apps/business/src/components/BlogCard.tsx b/apps/business/src/components/BlogCard.tsx index a98e36a..b5db0d8 100644 --- a/apps/business/src/components/BlogCard.tsx +++ b/apps/business/src/components/BlogCard.tsx @@ -6,6 +6,7 @@ import { formatBlogCardDate, isBlogVerified, } from '../services/blogService' +import { textLocaleAttrs } from '../utils/textLocale' import { Tooltip } from './Tooltip' import cardStyles from './BlogCard.module.css' import controlStyles from './ProductCard.module.css' @@ -31,6 +32,9 @@ export function BlogCard({ }: BlogCardProps) { const verified = isBlogVerified(blog) const publishDate = formatBlogCardDate(blog.publishedAt ?? blog.createdAt) + const titleLocale = textLocaleAttrs(blog.title) + const abstractLocale = textLocaleAttrs(blog.abstract) + const hasAbstract = Boolean(blog.abstract?.trim()) return (
@@ -60,11 +64,27 @@ export function BlogCard({
-

{blog.title}

- {blog.abstract ? ( -

{blog.abstract}

+

+ {blog.title} +

+ {hasAbstract ? ( +

+ {blog.abstract} +

) : ( -

No summary yet.

+

+ No summary yet. +

)}

{formatBlogAuthor(blog.author)} diff --git a/apps/business/src/components/BlogCategoryRow.tsx b/apps/business/src/components/BlogCategoryRow.tsx index 528b190..3c76c85 100644 --- a/apps/business/src/components/BlogCategoryRow.tsx +++ b/apps/business/src/components/BlogCategoryRow.tsx @@ -1,4 +1,4 @@ -import { FolderPlus, Trash2, ChevronRight } from 'lucide-react' +import { FolderPlus, Pencil, Trash2, ChevronRight } from 'lucide-react' import type { Category } from '../types/category' import { Tooltip } from './Tooltip' import styles from './CategoryRow.module.css' @@ -10,6 +10,7 @@ interface BlogCategoryRowProps { expanded: boolean onToggle: () => void onAddSub: (id: string) => void + onEdit: (id: string) => void onRemove: (id: string) => void } @@ -20,10 +21,11 @@ export function BlogCategoryRow({ expanded, onToggle, onAddSub, + onEdit, onRemove, }: BlogCategoryRowProps) { return ( -

+
+ + +
+ , + document.body, ) } diff --git a/apps/business/src/components/BrandModal.tsx b/apps/business/src/components/BrandModal.tsx index 54a4e2e..7897fa6 100644 --- a/apps/business/src/components/BrandModal.tsx +++ b/apps/business/src/components/BrandModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ImageCropper } from './ImageCropper' import type { Brand, BrandFormData } from '../types/brand' @@ -73,7 +74,7 @@ export function BrandModal({ }) } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/CategoryAiPromptModal.tsx b/apps/business/src/components/CategoryAiPromptModal.tsx index 7917bff..f505840 100644 --- a/apps/business/src/components/CategoryAiPromptModal.tsx +++ b/apps/business/src/components/CategoryAiPromptModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { Sparkles, X } from 'lucide-react' import { ApiError } from '../lib/api' import modalStyles from './CategoryModal.module.css' @@ -79,7 +80,7 @@ export function CategoryAiPromptModal({ if (!mounted) return null - return ( + return createPortal(
e.target === e.currentTarget && !isRunning && onClose()} @@ -157,5 +158,7 @@ export function CategoryAiPromptModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/CategoryModal.tsx b/apps/business/src/components/CategoryModal.tsx index ad4ee03..6df3597 100644 --- a/apps/business/src/components/CategoryModal.tsx +++ b/apps/business/src/components/CategoryModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { Category, CategoryFormData } from '../types/category' import { flattenCategories } from '../utils/categories' @@ -79,7 +80,7 @@ export function CategoryModal({ categories.filter((category) => category.id !== editingCategory?.id), ) - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/CategoryRow.tsx b/apps/business/src/components/CategoryRow.tsx index 6783507..27d6aa4 100644 --- a/apps/business/src/components/CategoryRow.tsx +++ b/apps/business/src/components/CategoryRow.tsx @@ -35,7 +35,7 @@ export function CategoryRow({ return (
+ , + document.body, ) } diff --git a/apps/business/src/components/ContactSubmissionDetailModal.tsx b/apps/business/src/components/ContactSubmissionDetailModal.tsx index 42345e8..a2ebcc5 100644 --- a/apps/business/src/components/ContactSubmissionDetailModal.tsx +++ b/apps/business/src/components/ContactSubmissionDetailModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { ContactSubmission } from '../types/contactSubmission' import { formatCellForDisplay } from '../lib/cellNumber' @@ -57,7 +58,7 @@ export function ContactSubmissionDetailModal({ const { date, time } = formatDateTime(submission.createdAt) - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/CreateProductVariantModal.tsx b/apps/business/src/components/CreateProductVariantModal.tsx index 0a201a7..f23fe83 100644 --- a/apps/business/src/components/CreateProductVariantModal.tsx +++ b/apps/business/src/components/CreateProductVariantModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { ProductVariant } from '../types/productVariant' import { buildVariantLabel } from '../types/productVariant' @@ -96,7 +97,7 @@ export function CreateProductVariantModal({ onSubmit({ variationId, optionId }) } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/CreateStoreItemsModal.tsx b/apps/business/src/components/CreateStoreItemsModal.tsx index 465306d..9db8613 100644 --- a/apps/business/src/components/CreateStoreItemsModal.tsx +++ b/apps/business/src/components/CreateStoreItemsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { Plus, X } from 'lucide-react' import { ApiError } from '../lib/api' import { listAllProducts } from '../services/productService' @@ -241,7 +242,7 @@ export function CreateStoreItemsModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/EditCustomerModal.tsx b/apps/business/src/components/EditCustomerModal.tsx index c3483f4..2589ba6 100644 --- a/apps/business/src/components/EditCustomerModal.tsx +++ b/apps/business/src/components/EditCustomerModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { formatCellForDisplay, toE164CellNumber } from '../lib/cellNumber' @@ -96,7 +97,7 @@ export function EditCustomerModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/EditStoreItemsModal.tsx b/apps/business/src/components/EditStoreItemsModal.tsx index 16f3a9f..b35aec5 100644 --- a/apps/business/src/components/EditStoreItemsModal.tsx +++ b/apps/business/src/components/EditStoreItemsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { Plus, X } from 'lucide-react' import { ApiError } from '../lib/api' import { @@ -209,7 +210,7 @@ export function EditStoreItemsModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/ImageLightbox.tsx b/apps/business/src/components/ImageLightbox.tsx index 7238882..a8df1d6 100644 --- a/apps/business/src/components/ImageLightbox.tsx +++ b/apps/business/src/components/ImageLightbox.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { ChevronLeft, ChevronRight, X } from 'lucide-react' import styles from './ImageLightbox.module.css' @@ -59,7 +60,7 @@ export function ImageLightbox({ const hasPrev = index > 0 const hasNext = index < images.length - 1 - return ( + return createPortal(
)}
+ , + document.body, ) } diff --git a/apps/business/src/components/OrderItemsModal.tsx b/apps/business/src/components/OrderItemsModal.tsx index 3be1d72..3a62474 100644 --- a/apps/business/src/components/OrderItemsModal.tsx +++ b/apps/business/src/components/OrderItemsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { Order } from '../services/orderService' import { formatCellForDisplay } from '../lib/cellNumber' @@ -59,7 +60,7 @@ export function OrderItemsModal({ open, order, onClose }: OrderItemsModalProps) const itemCount = totalQuantity(order) - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/OrderStepModal.tsx b/apps/business/src/components/OrderStepModal.tsx index ce3d015..0bbe855 100644 --- a/apps/business/src/components/OrderStepModal.tsx +++ b/apps/business/src/components/OrderStepModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { useToast } from '../context/ToastContext' import { ApiError } from '../lib/api' @@ -86,7 +87,7 @@ export function OrderStepModal({ steps.find((step) => step.id === order.processStepId)?.label || order.processStepId - return ( + return createPortal(
{ @@ -161,5 +162,7 @@ export function OrderStepModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/OrderTransactionsModal.tsx b/apps/business/src/components/OrderTransactionsModal.tsx index 3a0fd15..ecd2e5d 100644 --- a/apps/business/src/components/OrderTransactionsModal.tsx +++ b/apps/business/src/components/OrderTransactionsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { Order, OrderTransaction, TransactionStatus, TransactionType } from '../services/orderService' import { formatIrtPrice } from '../utils/irtPrice' @@ -116,7 +117,7 @@ export function OrderTransactionsModal({ open, order, onClose }: OrderTransactio if (!mounted || !order) return null - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/PageContent.module.css b/apps/business/src/components/PageContent.module.css index 1e89473..eade76d 100644 --- a/apps/business/src/components/PageContent.module.css +++ b/apps/business/src/components/PageContent.module.css @@ -52,6 +52,12 @@ gap: 24px; } +.gridCols4 { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 20px; +} + .gridFour { display: grid; grid-template-columns: repeat(2, 1fr); @@ -76,6 +82,12 @@ } } +@media (max-width: 1400px) { + .gridCols4 { + grid-template-columns: repeat(3, 1fr); + } +} + @media (max-width: 1200px) { .gridHome { grid-template-columns: repeat(3, 1fr); @@ -84,7 +96,8 @@ @media (max-width: 900px) { .gridHome, - .grid { + .grid, + .gridCols4 { grid-template-columns: repeat(2, 1fr); } } @@ -109,7 +122,8 @@ .grid, .gridHome, - .gridFour { + .gridFour, + .gridCols4 { grid-template-columns: 1fr; gap: 16px; } diff --git a/apps/business/src/components/Pagination.module.css b/apps/business/src/components/Pagination.module.css deleted file mode 100644 index f9d5ee0..0000000 --- a/apps/business/src/components/Pagination.module.css +++ /dev/null @@ -1,61 +0,0 @@ -.pagination { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; - margin-top: 32px; - padding-top: 24px; -} - -.navBtn { - width: 38px; - height: 38px; - display: flex; - align-items: center; - justify-content: center; - border-radius: var(--radius-sm); - color: var(--text-secondary); - background: var(--glass-bg); - border: 1px solid var(--glass-border); - transition: background 0.2s, color 0.2s, opacity 0.2s; -} - -.navBtn:hover:not(:disabled) { - background: rgba(var(--primary-rgb) / 0.1); - color: var(--primary); -} - -.navBtn:disabled { - opacity: 0.4; - cursor: not-allowed; -} - -.pages { - display: flex; - align-items: center; - gap: 4px; -} - -.pageBtn { - min-width: 38px; - height: 38px; - padding: 0 10px; - font-size: 14px; - font-weight: 500; - color: var(--text-secondary); - background: var(--glass-bg); - border: 1px solid var(--glass-border); - border-radius: var(--radius-sm); - transition: background 0.2s, color 0.2s, border-color 0.2s; -} - -.pageBtn:hover { - background: rgba(var(--primary-rgb) / 0.08); - color: var(--primary); -} - -.pageBtn.active { - background: var(--primary); - border-color: var(--primary); - color: white; -} diff --git a/apps/business/src/components/Pagination.tsx b/apps/business/src/components/Pagination.tsx index 551a570..704bd65 100644 --- a/apps/business/src/components/Pagination.tsx +++ b/apps/business/src/components/Pagination.tsx @@ -1,53 +1 @@ -import { ChevronLeft, ChevronRight } from 'lucide-react' -import styles from './Pagination.module.css' - -interface PaginationProps { - currentPage: number - totalPages: number - onPageChange: (page: number) => void -} - -export function Pagination({ currentPage, totalPages, onPageChange }: PaginationProps) { - if (totalPages <= 1) return null - - const pages = Array.from({ length: totalPages }, (_, i) => i + 1) - - return ( - - ) -} +export { Pagination, type PaginationProps } from '@meshkee/dashboard-ui' diff --git a/apps/business/src/components/PickStoreSpecialItemsModal.tsx b/apps/business/src/components/PickStoreSpecialItemsModal.tsx index 756f53a..b694752 100644 --- a/apps/business/src/components/PickStoreSpecialItemsModal.tsx +++ b/apps/business/src/components/PickStoreSpecialItemsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { listAllStoreItems } from '../services/storeItemService' @@ -118,7 +119,7 @@ export function PickStoreSpecialItemsModal({ if (!mounted) return null - return ( + return createPortal(
e.target === e.currentTarget && onClose()} @@ -175,5 +176,7 @@ export function PickStoreSpecialItemsModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/PickStoreVariantModal.tsx b/apps/business/src/components/PickStoreVariantModal.tsx index 6b706be..412c2d7 100644 --- a/apps/business/src/components/PickStoreVariantModal.tsx +++ b/apps/business/src/components/PickStoreVariantModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import type { StoreItem } from '../services/storeItemService' import { StoreItemPrice } from './StoreItemPrice' @@ -52,7 +53,7 @@ export function PickStoreVariantModal({ if (!mounted) return null - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/PickWebsiteBrandsModal.tsx b/apps/business/src/components/PickWebsiteBrandsModal.tsx index 7c846bf..e59f018 100644 --- a/apps/business/src/components/PickWebsiteBrandsModal.tsx +++ b/apps/business/src/components/PickWebsiteBrandsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { listAllBrands } from '../services/brandService' @@ -111,7 +112,7 @@ export function PickWebsiteBrandsModal({ if (!mounted) return null - return ( + return createPortal(
e.target === e.currentTarget && onClose()} @@ -170,5 +171,7 @@ export function PickWebsiteBrandsModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/PickWebsiteCategoriesModal.tsx b/apps/business/src/components/PickWebsiteCategoriesModal.tsx index 40677a0..12ca1be 100644 --- a/apps/business/src/components/PickWebsiteCategoriesModal.tsx +++ b/apps/business/src/components/PickWebsiteCategoriesModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { listProductCategories, mapProductCategoryToUi } from '../services/productCategoryService' @@ -112,7 +113,7 @@ export function PickWebsiteCategoriesModal({ if (!mounted) return null - return ( + return createPortal(
e.target === e.currentTarget && onClose()} @@ -171,5 +172,7 @@ export function PickWebsiteCategoriesModal({
+ , + document.body, ) } diff --git a/apps/business/src/components/PortfolioCard.module.css b/apps/business/src/components/PortfolioCard.module.css index 9a44ea6..82e5732 100644 --- a/apps/business/src/components/PortfolioCard.module.css +++ b/apps/business/src/components/PortfolioCard.module.css @@ -25,31 +25,28 @@ cursor: pointer; } -.clickable:hover .title { +.clickable:hover .titleFa, +.clickable:hover .titleEn { color: var(--primary); } .imageWrap { position: relative; width: 100%; - aspect-ratio: 3 / 2; overflow: hidden; - background: transparent; + background: rgba(148, 163, 184, 0.08); border-bottom: 1px solid rgba(148, 163, 184, 0.12); } .image { - position: relative; - z-index: 1; - width: 100%; - height: 100%; - object-fit: contain; display: block; + width: 100%; + height: auto; } .imagePlaceholder { width: 100%; - height: 100%; + aspect-ratio: 3 / 2; background: linear-gradient( 135deg, rgba(148, 163, 184, 0.12) 0%, @@ -65,11 +62,15 @@ flex: 1; } -.title { +.titleFa { + margin: 0; + font-family: var(--font-fa), var(--font-en); font-size: 15px; - font-weight: 600; + font-weight: 500; line-height: 1.4; color: var(--text-primary); + direction: rtl; + text-align: right; transition: color 0.2s; display: -webkit-box; -webkit-line-clamp: 2; @@ -77,6 +78,20 @@ overflow: hidden; } +.titleEn { + margin: 0; + font-size: 13px; + font-weight: 500; + line-height: 1.35; + color: var(--text-secondary); + text-align: left; + transition: color 0.2s; + display: -webkit-box; + -webkit-line-clamp: 1; + -webkit-box-orient: vertical; + overflow: hidden; +} + .abstract { margin: 0; font-size: 13px; @@ -88,6 +103,14 @@ overflow: hidden; } +.abstract[dir='rtl'] { + text-align: right; +} + +.abstract[dir='ltr'] { + text-align: left; +} + .meta { margin: 0; font-size: 12px; diff --git a/apps/business/src/components/PortfolioCard.tsx b/apps/business/src/components/PortfolioCard.tsx index c90fa01..eb6fbf2 100644 --- a/apps/business/src/components/PortfolioCard.tsx +++ b/apps/business/src/components/PortfolioCard.tsx @@ -2,6 +2,7 @@ import { Link } from 'react-router-dom' import { Pencil, MessageSquare, Trash2 } from 'lucide-react' import type { Portfolio } from '../types/portfolio' import { formatPortfolioCardDate } from '../services/portfolioService' +import { textLocaleAttrs } from '../utils/textLocale' import { Tooltip } from './Tooltip' import cardStyles from './PortfolioCard.module.css' import controlStyles from './ProductCard.module.css' @@ -22,6 +23,12 @@ export function PortfolioCard({ onRemove, }: PortfolioCardProps) { const publishDate = formatPortfolioCardDate(portfolio.publishedAt ?? portfolio.createdAt) + const titleFa = (portfolio.titleFa || portfolio.title || '').trim() + const titleEn = (portfolio.titleEn || '').trim() + const showBothTitles = Boolean(titleFa && titleEn) + const showAbstract = !showBothTitles + const abstractLocale = textLocaleAttrs(portfolio.abstract) + const hasAbstract = Boolean(portfolio.abstract?.trim()) return (
@@ -30,7 +37,7 @@ export function PortfolioCard({ {portfolio.titleImageUrl ? ( {portfolio.title} @@ -40,12 +47,33 @@ export function PortfolioCard({
-

{portfolio.title}

- {portfolio.abstract ? ( -

{portfolio.abstract}

- ) : ( -

No summary yet.

- )} + {titleFa ? ( +

+ {titleFa} +

+ ) : null} + {titleEn ? ( +

+ {titleEn} +

+ ) : null} + {showAbstract ? ( + hasAbstract ? ( +

+ {portfolio.abstract} +

+ ) : ( +

+ No summary yet. +

+ ) + ) : null}

{portfolio.categoryName ? ( <> diff --git a/apps/business/src/components/PortfolioCommentsModal.tsx b/apps/business/src/components/PortfolioCommentsModal.tsx index fc428ab..d088926 100644 --- a/apps/business/src/components/PortfolioCommentsModal.tsx +++ b/apps/business/src/components/PortfolioCommentsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X, ThumbsUp, Check, XCircle, Trash2 } from 'lucide-react' import type { ProductComment } from '../types/comment' import { formatCommentDate } from '../data/productComments' @@ -147,7 +148,7 @@ export function PortfolioCommentsModal({ } } - return ( + return createPortal(

+ , + document.body, ) } diff --git a/apps/business/src/components/ProductCard.module.css b/apps/business/src/components/ProductCard.module.css index 1a5089c..9fa6f2f 100644 --- a/apps/business/src/components/ProductCard.module.css +++ b/apps/business/src/components/ProductCard.module.css @@ -35,6 +35,7 @@ overflow: hidden; background: #ffffff; border-bottom: 1px solid rgba(148, 163, 184, 0.12); + border-radius: calc(var(--radius) - 1px) calc(var(--radius) - 1px) 0 0; } .image { @@ -80,6 +81,7 @@ .nameFa { font-family: var(--font-fa), var(--font-en); font-size: 12px; + font-weight: 500; color: var(--text-secondary); direction: rtl; text-align: left; diff --git a/apps/business/src/components/ProductCommentsModal.tsx b/apps/business/src/components/ProductCommentsModal.tsx index 931d8c5..59ff09f 100644 --- a/apps/business/src/components/ProductCommentsModal.tsx +++ b/apps/business/src/components/ProductCommentsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X, ThumbsUp, Check, XCircle, Trash2 } from 'lucide-react' import type { ProductComment } from '../types/comment' import { formatCommentDate } from '../data/productComments' @@ -147,7 +148,7 @@ export function ProductCommentsModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/ProductTechnicalInfoModal.tsx b/apps/business/src/components/ProductTechnicalInfoModal.tsx index 5f4deb2..fe1acb8 100644 --- a/apps/business/src/components/ProductTechnicalInfoModal.tsx +++ b/apps/business/src/components/ProductTechnicalInfoModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { @@ -210,7 +211,7 @@ export function ProductTechnicalInfoModal({ ) } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/ProductVariantsModal.tsx b/apps/business/src/components/ProductVariantsModal.tsx index 0dc6791..e032acb 100644 --- a/apps/business/src/components/ProductVariantsModal.tsx +++ b/apps/business/src/components/ProductVariantsModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { @@ -119,7 +120,7 @@ export function ProductVariantsModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/SearchableSelect.module.css b/apps/business/src/components/SearchableSelect.module.css index 970e686..1c0c1db 100644 --- a/apps/business/src/components/SearchableSelect.module.css +++ b/apps/business/src/components/SearchableSelect.module.css @@ -131,6 +131,7 @@ .optionFa { font-family: var(--font-fa), var(--font-en); + font-weight: 500; direction: rtl; } diff --git a/apps/business/src/components/ShoppingCartModal.tsx b/apps/business/src/components/ShoppingCartModal.tsx index 7a435d8..02e3e0a 100644 --- a/apps/business/src/components/ShoppingCartModal.tsx +++ b/apps/business/src/components/ShoppingCartModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useMemo, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { ArrowLeft, Minus, Plus, Search, Trash2, User, X } from 'lucide-react' import { useDraftCart } from '../context/DraftCartContext' import { useToast } from '../context/ToastContext' @@ -341,7 +342,7 @@ export function ShoppingCartModal({ open, onClose, onOrderCreated }: ShoppingCar const canAddPayment = payments.length < PAYMENT_METHOD_OPTIONS.length - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/StoreItemCard.module.css b/apps/business/src/components/StoreItemCard.module.css index 48a8763..ebe8db2 100644 --- a/apps/business/src/components/StoreItemCard.module.css +++ b/apps/business/src/components/StoreItemCard.module.css @@ -103,6 +103,7 @@ .nameFa { font-family: var(--font-fa), var(--font-en); font-size: 12px; + font-weight: 500; color: var(--text-secondary); direction: rtl; text-align: left; diff --git a/apps/business/src/components/StoreItemDiscountModal.tsx b/apps/business/src/components/StoreItemDiscountModal.tsx index f60fc35..7a3e1d7 100644 --- a/apps/business/src/components/StoreItemDiscountModal.tsx +++ b/apps/business/src/components/StoreItemDiscountModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { @@ -119,7 +120,7 @@ export function StoreItemDiscountModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/StoreItemFestivalModal.tsx b/apps/business/src/components/StoreItemFestivalModal.tsx index b094686..81b4267 100644 --- a/apps/business/src/components/StoreItemFestivalModal.tsx +++ b/apps/business/src/components/StoreItemFestivalModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import { ApiError } from '../lib/api' import { @@ -114,7 +115,7 @@ export function StoreItemFestivalModal({ } } - return ( + return createPortal(
+ , + document.body, ) } diff --git a/apps/business/src/components/StoreSpecialModal.tsx b/apps/business/src/components/StoreSpecialModal.tsx index bcd999d..d8df61b 100644 --- a/apps/business/src/components/StoreSpecialModal.tsx +++ b/apps/business/src/components/StoreSpecialModal.tsx @@ -1,4 +1,5 @@ import { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { X } from 'lucide-react' import styles from './CategoryModal.module.css' @@ -63,13 +64,18 @@ export function StoreSpecialModal({ onSubmit(trimmed) } - return ( + return createPortal(
e.target === e.currentTarget && onClose()} role="presentation" > -
+

{title} @@ -107,5 +113,7 @@ export function StoreSpecialModal({

+ , + document.body, ) } diff --git a/apps/business/src/components/TechnicalFormAiPromptModal.tsx b/apps/business/src/components/TechnicalFormAiPromptModal.tsx new file mode 100644 index 0000000..998ee99 --- /dev/null +++ b/apps/business/src/components/TechnicalFormAiPromptModal.tsx @@ -0,0 +1,160 @@ +import { useEffect, useState } from 'react' +import { createPortal } from 'react-dom' +import { Sparkles, X } from 'lucide-react' +import modalStyles from './CategoryModal.module.css' +import aiStyles from '../styles/ai.module.css' +import styles from './CategoryAiPromptModal.module.css' + +export function buildTechnicalFormAiPrompt(categoryName: string) { + return `Suggest technical data form fields for the "${categoryName}" product category. + +For each field include: +- A short English label (e.g. "Screen Size", "Material", "Color") +- The input type: text, textarea, select, or multi_select +- Whether it is required +- For select / multi_select: the list of options + +Focus on specs and attributes that shoppers typically compare when buying this type of product.` +} + +interface TechnicalFormAiPromptModalProps { + open: boolean + categoryName: string + onClose: () => void + onRun: (prompt: string) => Promise + isRunning: boolean +} + +const ANIMATION_MS = 220 + +export function TechnicalFormAiPromptModal({ + open, + categoryName, + onClose, + onRun, + isRunning, +}: TechnicalFormAiPromptModalProps) { + const [mounted, setMounted] = useState(open) + const [closing, setClosing] = useState(false) + const [prompt, setPrompt] = useState(() => buildTechnicalFormAiPrompt(categoryName)) + const [error, setError] = useState('') + + useEffect(() => { + if (open) { + setMounted(true) + setClosing(false) + setPrompt(buildTechnicalFormAiPrompt(categoryName)) + setError('') + } else if (mounted) { + setClosing(true) + const timer = setTimeout(() => { + setMounted(false) + setClosing(false) + }, ANIMATION_MS) + return () => clearTimeout(timer) + } + }, [open, mounted, categoryName]) + + useEffect(() => { + if (!mounted || closing) return + const onKey = (e: KeyboardEvent) => { + if (e.key === 'Escape' && !isRunning) onClose() + } + document.addEventListener('keydown', onKey) + return () => document.removeEventListener('keydown', onKey) + }, [mounted, closing, isRunning, onClose]) + + async function handleSubmit(e: React.FormEvent) { + e.preventDefault() + const trimmed = prompt.trim() + if (trimmed.length < 10) { + setError('Prompt must be at least 10 characters.') + return + } + setError('') + try { + await onRun(trimmed) + } catch (err) { + if (err instanceof Error) { + setError(err.message) + } else { + setError('Unable to generate technical form with AI.') + } + } + } + + if (!mounted) return null + + return createPortal( +
e.target === e.currentTarget && !isRunning && onClose()} + role="presentation" + > +
+
+
+

+ Generate Technical Form with AI +

+

+ Edit the prompt below, then run it to fill the form fields. +

+
+ +
+ +
void handleSubmit(e)}> +
+ +