diff --git a/apps/business/src/components/ChangeUserAccessModal.module.css b/apps/business/src/components/ChangeUserAccessModal.module.css index c4a92e5..279037f 100644 --- a/apps/business/src/components/ChangeUserAccessModal.module.css +++ b/apps/business/src/components/ChangeUserAccessModal.module.css @@ -6,7 +6,7 @@ .roleOption { display: flex; - align-items: center; + align-items: flex-start; gap: 10px; padding: 10px 12px; border-radius: 10px; @@ -16,17 +16,37 @@ font-family: var(--font-ui); } +.roleOption input[type='radio'] { + accent-color: var(--primary); + margin-top: 2px; + flex-shrink: 0; +} + .roleOption:has(input:checked) { border-color: rgba(var(--primary-rgb) / 0.35); background: rgba(var(--primary-rgb) / 0.08); } +.roleOptionText { + display: flex; + flex-direction: column; + gap: 4px; + min-width: 0; +} + .roleOptionLabel { font-size: 13px; font-weight: 600; color: var(--text-primary); } +.roleOptionDesc { + font-size: 12px; + font-weight: 500; + color: var(--text-secondary); + line-height: 1.45; +} + .roleHint { margin: 12px 0 8px; font-size: 12px; @@ -36,12 +56,25 @@ } .roleListNested { + display: grid; + grid-template-columns: 1fr; + gap: 8px; margin-top: 4px; margin-inline-start: 12px; padding-inline-start: 10px; border-inline-start: 2px solid rgba(var(--primary-rgb) / 0.2); } +@media (min-width: 560px) { + .roleListNested { + grid-template-columns: 1fr 1fr; + } + + .roleListNested .roleOption:last-child:nth-child(odd) { + grid-column: 1 / -1; + } +} + .roleBadge { display: inline-block; margin-top: 4px; diff --git a/apps/business/src/components/ChangeUserAccessModal.tsx b/apps/business/src/components/ChangeUserAccessModal.tsx index 8d7208d..e97000a 100644 --- a/apps/business/src/components/ChangeUserAccessModal.tsx +++ b/apps/business/src/components/ChangeUserAccessModal.tsx @@ -23,6 +23,12 @@ const TEAM_ROLE_LABEL_KEYS: Record<(typeof ALL_TEAM_ROLES)[number], BusinessMess viewer: 'customers.access.role.viewer', } +const TEAM_ROLE_DESC_KEYS: Record<(typeof ALL_TEAM_ROLES)[number], BusinessMessageKey> = { + admin: 'customers.access.role.admin.desc', + editor: 'customers.access.role.editor.desc', + viewer: 'customers.access.role.viewer.desc', +} + export interface ChangeUserAccessModalProps { open: boolean user: BusinessCustomerListItem | null @@ -185,27 +191,33 @@ export function ChangeUserAccessModal({ {access === 'staff' ? ( <> -

- {canAssignAdmin - ? t('customers.access.hintSuperAdmin') - : t('customers.access.hintBusiness')} -

+ {!canAssignAdmin ? ( +

{t('customers.access.hintBusiness')}

+ ) : null}
- {teamRoles.map((slug) => ( - - ))} + {teamRoles.map((slug) => { + const role = slug as (typeof ALL_TEAM_ROLES)[number] + return ( + + ) + })}
) : null} diff --git a/apps/business/src/components/ListFiltersPanel.module.css b/apps/business/src/components/ListFiltersPanel.module.css index 4aaadbd..d7667ed 100644 --- a/apps/business/src/components/ListFiltersPanel.module.css +++ b/apps/business/src/components/ListFiltersPanel.module.css @@ -10,10 +10,7 @@ } .filtersTitle { - font-size: 13px; - font-weight: 700; - color: var(--text-primary); - margin-bottom: 8px; + display: none; } .filtersGrid { diff --git a/apps/business/src/components/PageContent.module.css b/apps/business/src/components/PageContent.module.css index 60a832f..8b1f580 100644 --- a/apps/business/src/components/PageContent.module.css +++ b/apps/business/src/components/PageContent.module.css @@ -8,14 +8,33 @@ align-items: flex-start; justify-content: space-between; gap: 24px; - margin-bottom: 36px; + margin-bottom: 12px; } .pageTitle { font-size: 28px; font-weight: 700; color: var(--text-primary); - margin-bottom: 8px; + margin-bottom: 0; + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.15em 0.4em; +} + +.pageTitleEn { + font-size: 0.52em; + font-weight: 700; + letter-spacing: 0.22em; + text-transform: uppercase; + color: var(--text-muted); + font-family: var(--font-en), var(--font-ui); +} + +.pageTitleEn::before { + content: '•'; + margin-inline-end: 0.4em; + letter-spacing: 0; } .welcomeTitle { @@ -26,8 +45,14 @@ } .pageSubtitle { + display: none; +} + +.pageSubtitleContent { + display: block; font-size: 15px; color: var(--text-secondary); + margin-top: 6px; } .welcomeSubtitle { diff --git a/apps/business/src/components/PageTitle.tsx b/apps/business/src/components/PageTitle.tsx new file mode 100644 index 0000000..bfa3fbe --- /dev/null +++ b/apps/business/src/components/PageTitle.tsx @@ -0,0 +1,19 @@ +import { useLocale } from '@meshkee/dashboard-ui' +import type { ReactNode } from 'react' +import pageStyles from './PageContent.module.css' + +interface PageTitleProps { + children: ReactNode + /** English accent shown after a bullet in FA locale (e.g. USERS). */ + en?: string +} + +export function PageTitle({ children, en }: PageTitleProps) { + const { locale } = useLocale() + return ( +

+ {children} + {en && locale === 'fa' ? {en} : null} +

+ ) +} diff --git a/apps/business/src/i18n/messages.ts b/apps/business/src/i18n/messages.ts index 3836791..3a0ccc8 100644 --- a/apps/business/src/i18n/messages.ts +++ b/apps/business/src/i18n/messages.ts @@ -27,7 +27,7 @@ const en = { 'nav.store.shipping': 'Shipping Fees', 'nav.store.cards': 'Shopping Cards', 'nav.store.settings': 'Settings', - 'nav.customers': 'Customers', + 'nav.customers': 'Users', 'nav.customerProducts': 'Customer products', 'nav.settings': 'Settings', 'nav.blog': 'Blog', @@ -158,7 +158,7 @@ const en = { 'home.card.store.desc': 'Manage your store settings, pages and themes.', 'home.card.store.link': 'View store', 'home.card.store.count': 'on sale', - 'home.card.customers.title': 'Customers', + 'home.card.customers.title': 'Users', 'home.card.customers.desc': 'View and manage your customers and their activity.', 'home.card.customers.link': 'View customers', 'home.card.customers.count': 'people', @@ -185,7 +185,7 @@ const en = { 'home.chart.orders.error': 'Unable to load order activity.', 'home.chart.orders.bar': '{day}: {count} orders', 'home.chart.orders.cartBar': '{day}: {count} added to basket', - 'home.chart.customers.title': 'Customers', + 'home.chart.customers.title': 'Users', 'home.chart.customers.subtitle': 'Registrations and active users in the last 30 days', 'home.chart.customers.legend': 'Registered ({count})', 'home.chart.customers.activeLegend': 'Active ({count})', @@ -766,7 +766,7 @@ const en = { 'storeSettings.error.saveSteps': 'Unable to save order process steps.', 'storeSettings.stepsSaved': 'Order process steps saved.', - 'customers.title': 'Customers', + 'customers.title': 'Users', 'customers.subtitle': 'View customers who have registered or ordered from your business.', 'customers.filters': 'Filters', @@ -785,6 +785,7 @@ const en = { 'customers.loading': 'Loading customers...', 'customers.pageMeta': 'Page {page} / {totalPages} · {pageSize} per page · {total} total', 'customers.col.name': 'Name', + 'customers.col.role': 'Role', 'customers.col.cell': 'Cell number', 'customers.col.email': 'Email', 'customers.col.orders': 'Orders', @@ -839,11 +840,16 @@ const en = { 'customers.access.manager': 'Manager', 'customers.access.role.admin': 'Admin', 'customers.access.role.editor': 'Editor', - 'customers.access.role.viewer': 'Viewer', + 'customers.access.role.viewer': 'Observer', + 'customers.access.role.admin.desc': + 'Can view and edit content, and also assign editors and observers.', + 'customers.access.role.editor.desc': 'Can view content and edit it.', + 'customers.access.role.viewer.desc': + 'Can only view content. Best for order management and content quality review.', 'customers.access.hintSuperAdmin': 'Admin can manage other managers (except other admins). Editor and viewer manage content only.', 'customers.access.hintBusiness': - 'Managers can be Editor or Viewer. Only a super admin can assign Admin.', + 'Managers can be Editor or Observer. Only a super admin can assign Admin.', 'customers.access.cancel': 'Cancel', 'customers.access.save': 'Save', 'customers.access.error': 'Unable to update access.', @@ -853,7 +859,7 @@ const en = { 'customers.access.badge.owner': 'Owner', 'customers.access.badge.admin': 'Admin', 'customers.access.badge.editor': 'Editor', - 'customers.access.badge.viewer': 'Viewer', + 'customers.access.badge.viewer': 'Observer', 'customers.access.badge.manager': 'Manager', 'customers.toast.accessUpdated': 'Access updated to {role}.', @@ -1261,7 +1267,7 @@ const en = { 'title.storeItems': 'My Store Items', 'title.orders': 'My Orders', 'title.shoppingCards': 'Shopping Cards', - 'title.customers': 'Customers', + 'title.customers': 'Users', 'title.customerProducts': 'Customer products', 'title.blog': 'Blog', 'title.myBlogs': 'My Blogs', @@ -1396,7 +1402,7 @@ const fa: Record = { 'nav.store.shipping': 'هزینه ارسال', 'nav.store.cards': 'کارت‌های خرید', 'nav.store.settings': 'تنظیمات', - 'nav.customers': 'مشتریان', + 'nav.customers': 'کاربران', 'nav.customerProducts': 'محصولات مشتریان', 'nav.settings': 'تنظیمات', 'nav.blog': 'بلاگ', @@ -1527,7 +1533,7 @@ const fa: Record = { 'home.card.store.desc': 'تنظیمات، صفحات و ظاهر فروشگاه را مدیریت کنید.', 'home.card.store.link': 'مشاهده فروشگاه', 'home.card.store.count': 'محصول فروش', - 'home.card.customers.title': 'مشتریان', + 'home.card.customers.title': 'کاربران', 'home.card.customers.desc': 'مشتریان و فعالیت آن‌ها را ببینید و مدیریت کنید.', 'home.card.customers.link': 'مشاهده مشتریان', 'home.card.customers.count': 'نفر', @@ -1554,7 +1560,7 @@ const fa: Record = { 'home.chart.orders.error': 'بارگذاری فعالیت سفارش‌ها ممکن نشد.', 'home.chart.orders.bar': '{day}: {count} سفارش', 'home.chart.orders.cartBar': '{day}: {count} افزودن به سبد', - 'home.chart.customers.title': 'مشتریان', + 'home.chart.customers.title': 'کاربران', 'home.chart.customers.subtitle': 'ثبت‌نام و کاربران فعال در ۳۰ روز گذشته', 'home.chart.customers.legend': 'ثبت‌نام ({count})', 'home.chart.customers.activeLegend': 'فعال ({count})', @@ -2133,7 +2139,7 @@ const fa: Record = { 'storeSettings.error.saveSteps': 'ذخیره مراحل فرآیند سفارش ممکن نشد.', 'storeSettings.stepsSaved': 'مراحل فرآیند سفارش ذخیره شد.', - 'customers.title': 'مشتریان', + 'customers.title': 'کاربران', 'customers.subtitle': 'مشتریانی را ببینید که در کسب‌وکار شما ثبت‌نام کرده یا سفارش داده‌اند.', 'customers.filters': 'فیلترها', @@ -2152,6 +2158,7 @@ const fa: Record = { 'customers.loading': 'در حال بارگذاری مشتریان...', 'customers.pageMeta': 'صفحه {page} / {totalPages} · {pageSize} در هر صفحه · {total} کل', 'customers.col.name': 'نام', + 'customers.col.role': 'نقش', 'customers.col.cell': 'شماره موبایل', 'customers.col.email': 'ایمیل', 'customers.col.orders': 'سفارش‌ها', @@ -2206,21 +2213,26 @@ const fa: Record = { 'customers.access.manager': 'مدیر', 'customers.access.role.admin': 'ادمین', 'customers.access.role.editor': 'ویرایشگر', - 'customers.access.role.viewer': 'بیننده', + 'customers.access.role.viewer': 'ناظر', + 'customers.access.role.admin.desc': + 'ادمین می‌تواند ببیند، ویرایش کند و همچنین دیگر ویرایشگران و ناظرین را مشخص کند.', + 'customers.access.role.editor.desc': 'ویرایشگر می‌تواند محتواها را ببیند و آن‌ها را ویرایش کند.', + 'customers.access.role.viewer.desc': + 'ناظر می‌تواند فقط محتوا را ببیند. ناظر بیشتر برای مدیریت سفارشات و بررسی کیفی محتواها کاربرد دارد.', 'customers.access.hintSuperAdmin': - 'ادمین می‌تواند مدیران دیگر را مدیریت کند (به‌جز ادمین‌های دیگر). ویرایشگر و بیننده فقط محتوا را مدیریت می‌کنند.', + 'ادمین می‌تواند مدیران دیگر را مدیریت کند (به‌جز ادمین‌های دیگر). ویرایشگر و ناظر محتوا را مدیریت می‌کنند.', 'customers.access.hintBusiness': - 'مدیران می‌توانند ویرایشگر یا بیننده باشند. فقط سوپرادمین می‌تواند ادمین تعیین کند.', + 'مدیران می‌توانند ویرایشگر یا ناظر باشند. فقط سوپرادمین می‌تواند ادمین تعیین کند.', 'customers.access.cancel': 'انصراف', 'customers.access.save': 'ذخیره', 'customers.access.error': 'به‌روزرسانی دسترسی ممکن نشد.', 'customers.access.change': 'تغییر دسترسی', 'customers.access.ownerLocked': 'نقش صاحب کسب‌وکار قابل تغییر نیست', 'customers.access.adminLocked': 'فقط سوپرادمین می‌تواند ادمین را تغییر دهد', - 'customers.access.badge.owner': 'صاحب', + 'customers.access.badge.owner': 'مالک کسب و کار', 'customers.access.badge.admin': 'ادمین', 'customers.access.badge.editor': 'ویرایشگر', - 'customers.access.badge.viewer': 'بیننده', + 'customers.access.badge.viewer': 'ناظر', 'customers.access.badge.manager': 'مدیر', 'customers.toast.accessUpdated': 'دسترسی به {role} به‌روزرسانی شد.', @@ -2627,7 +2639,7 @@ const fa: Record = { 'title.storeItems': 'اقلام فروشگاه', 'title.orders': 'سفارش‌های من', 'title.shoppingCards': 'کارت‌های خرید', - 'title.customers': 'مشتریان', + 'title.customers': 'کاربران', 'title.customerProducts': 'محصولات مشتریان', 'title.blog': 'بلاگ', 'title.myBlogs': 'بلاگ‌های من', diff --git a/apps/business/src/pages/BlogCategoriesPage.tsx b/apps/business/src/pages/BlogCategoriesPage.tsx index 6759f99..9304e82 100644 --- a/apps/business/src/pages/BlogCategoriesPage.tsx +++ b/apps/business/src/pages/BlogCategoriesPage.tsx @@ -3,6 +3,7 @@ import { Plus } from 'lucide-react' import { CategoryModal } from '../components/CategoryModal' import { BlogCategoryTree } from '../components/BlogCategoryTree' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { ConfirmDeleteModal } from '../components/ConfirmDeleteModal' import type { Category, CategoryFormData } from '../types/category' import { ApiError } from '../lib/api' @@ -159,7 +160,7 @@ export function BlogCategoriesPage() { />
-

{t('blog.categories.title')}

+ {t('blog.categories.title')}

{t('blog.categories.subtitle')}

diff --git a/apps/business/src/pages/BlogDetailsPage.tsx b/apps/business/src/pages/BlogDetailsPage.tsx index 33fce94..2166531 100644 --- a/apps/business/src/pages/BlogDetailsPage.tsx +++ b/apps/business/src/pages/BlogDetailsPage.tsx @@ -117,7 +117,7 @@ export function BlogDetailsPage() { {blog.abstract ? (

-

{t('title.myBlogs')}

+ {t('title.myBlogs')}

{t('blog.list.subtitle', { count: totalBlogs })}

diff --git a/apps/business/src/pages/BlogPage.tsx b/apps/business/src/pages/BlogPage.tsx index be46c92..4a2bfa2 100644 --- a/apps/business/src/pages/BlogPage.tsx +++ b/apps/business/src/pages/BlogPage.tsx @@ -1,6 +1,7 @@ import { FileText, PlusCircle, FolderTree, Settings } from 'lucide-react' import { SectionCard } from '../components/SectionCard' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { useT } from '../i18n/useT' import type { BusinessMessageKey } from '../i18n/messages' import styles from '../components/PageContent.module.css' @@ -55,7 +56,7 @@ export function BlogPage() { />
-

{t('title.blog')}

+ {t('title.blog')}

{t('blog.page.subtitle')}

diff --git a/apps/business/src/pages/BlogSettingsPage.tsx b/apps/business/src/pages/BlogSettingsPage.tsx index 8eb6891..187b3ee 100644 --- a/apps/business/src/pages/BlogSettingsPage.tsx +++ b/apps/business/src/pages/BlogSettingsPage.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from 'react' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { Switch } from '../components/Switch' import { useToast } from '../context/ToastContext' import { useT } from '../i18n/useT' @@ -83,7 +84,7 @@ export function BlogSettingsPage() {
-

{t('blog.settings.title')}

+ {t('blog.settings.title')}

{t('blog.settings.subtitle')}

diff --git a/apps/business/src/pages/BrandsPage.tsx b/apps/business/src/pages/BrandsPage.tsx index 87f9819..f65062c 100644 --- a/apps/business/src/pages/BrandsPage.tsx +++ b/apps/business/src/pages/BrandsPage.tsx @@ -4,6 +4,7 @@ import { useToast } from '../context/ToastContext' import { BrandModal } from '../components/BrandModal' import { BrandRow } from '../components/BrandRow' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { ConfirmDeleteModal } from '../components/ConfirmDeleteModal' import type { Brand, BrandFormData } from '../types/brand' import { ApiError } from '../lib/api' @@ -142,7 +143,7 @@ export function BrandsPage() { />
-

{t('title.brands')}

+ {t('title.brands')}

{t('brands.page.subtitle')}

diff --git a/apps/business/src/pages/BusinessProfilePage.tsx b/apps/business/src/pages/BusinessProfilePage.tsx index 16650d8..609ec2a 100644 --- a/apps/business/src/pages/BusinessProfilePage.tsx +++ b/apps/business/src/pages/BusinessProfilePage.tsx @@ -10,6 +10,7 @@ import { type AddressListItem, } from '@meshkee/dashboard-ui' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { ImageCropper } from '../components/ImageCropper' import { MultiSelectDropdown } from '../components/MultiSelectDropdown' import { RichTextEditor } from '../components/RichTextEditor' @@ -340,7 +341,7 @@ export function BusinessProfilePage() {
-

{t('title.businessProfile')}

+ {t('title.businessProfile')}

{t('bizProfile.subtitle')}

diff --git a/apps/business/src/pages/CategoriesPage.tsx b/apps/business/src/pages/CategoriesPage.tsx index cc14bde..3fbc93a 100644 --- a/apps/business/src/pages/CategoriesPage.tsx +++ b/apps/business/src/pages/CategoriesPage.tsx @@ -5,6 +5,7 @@ import { CategoryModal } from '../components/CategoryModal' import { CategoryAiPromptModal } from '../components/CategoryAiPromptModal' import { CategoryTree } from '../components/CategoryTree' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { ConfirmDeleteModal } from '../components/ConfirmDeleteModal' import { VariationsModal } from '../components/VariationsModal' import { TechnicalFormModal } from '../components/TechnicalFormModal' @@ -427,7 +428,7 @@ export function CategoriesPage() { />
-

{t('title.categories')}

+ {t('title.categories')}

{t('categories.page.subtitle')}

diff --git a/apps/business/src/pages/CustomerProductDetailsPage.tsx b/apps/business/src/pages/CustomerProductDetailsPage.tsx index ad54f39..4b8ec4c 100644 --- a/apps/business/src/pages/CustomerProductDetailsPage.tsx +++ b/apps/business/src/pages/CustomerProductDetailsPage.tsx @@ -3,6 +3,7 @@ import { Link, useNavigate, useParams } from 'react-router-dom' import { ImageOff, MapPin, Pencil, User } from 'lucide-react' import { useLocale } from '@meshkee/dashboard-ui' import { Breadcrumbs } from '../components/Breadcrumbs' +import { PageTitle } from '../components/PageTitle' import { UserProductStatusModal } from '../components/UserProductStatusModal' import { useToast } from '../context/ToastContext' import { useT } from '../i18n/useT' @@ -197,8 +198,8 @@ export function CustomerProductDetailsPage() {
-

{t('customerProducts.detailsTitle')}

-

{t('customerProducts.detailsSubtitle')}

+ {t('customerProducts.detailsTitle')} +

{t('customerProducts.detailsSubtitle')}

+ {canOpenBusinessDashboard ? ( + + + + ) : null}
diff --git a/apps/customer/src/pages/OrdersPage.tsx b/apps/customer/src/pages/OrdersPage.tsx index d17ded1..0f87e05 100644 --- a/apps/customer/src/pages/OrdersPage.tsx +++ b/apps/customer/src/pages/OrdersPage.tsx @@ -1,3 +1,4 @@ +import { PageTitle } from '../components/PageTitle' import { useEffect, useMemo, useState } from 'react' import { Breadcrumbs, Pagination, useLocale } from '@meshkee/dashboard-ui' import { OrderItemsModal } from '../components/OrderItemsModal' @@ -71,7 +72,7 @@ export function OrdersPage() {
-

{t('orders.title')}

+ {t('orders.title')}

{t('orders.subtitle')}

diff --git a/apps/customer/src/pages/ProfilePage.tsx b/apps/customer/src/pages/ProfilePage.tsx index 0738f06..bed1130 100644 --- a/apps/customer/src/pages/ProfilePage.tsx +++ b/apps/customer/src/pages/ProfilePage.tsx @@ -1,3 +1,4 @@ +import { PageTitle } from '../components/PageTitle' import { useEffect, useState } from 'react' import { Breadcrumbs, useToast } from '@meshkee/dashboard-ui' import { useAuth } from '../context/AuthContext' @@ -81,7 +82,7 @@ export function ProfilePage() {
-

{t('profile.title')}

+ {t('profile.title')}

{t('profile.subtitle')}

diff --git a/apps/super-admin/src/components/PageContent.module.css b/apps/super-admin/src/components/PageContent.module.css index ce3354e..2524839 100644 --- a/apps/super-admin/src/components/PageContent.module.css +++ b/apps/super-admin/src/components/PageContent.module.css @@ -8,19 +8,44 @@ align-items: flex-start; justify-content: space-between; gap: 16px; - margin-bottom: 24px; + margin-bottom: 12px; } .pageTitle { font-size: 24px; font-weight: 700; color: var(--text-primary); - margin-bottom: 4px; + margin-bottom: 0; + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.15em 0.4em; +} + +.pageTitleEn { + font-size: 0.52em; + font-weight: 700; + letter-spacing: 0.22em; + text-transform: uppercase; + color: var(--text-secondary); + font-family: var(--font-en), var(--font-ui); +} + +.pageTitleEn::before { + content: '•'; + margin-inline-end: 0.4em; + letter-spacing: 0; } .pageSubtitle { + display: none; +} + +.pageSubtitleContent { + display: block; font-size: 14px; color: var(--text-secondary); + margin-top: 6px; } .dateBadge { diff --git a/apps/super-admin/src/components/PageTitle.tsx b/apps/super-admin/src/components/PageTitle.tsx new file mode 100644 index 0000000..14b552a --- /dev/null +++ b/apps/super-admin/src/components/PageTitle.tsx @@ -0,0 +1,17 @@ +import type { ReactNode } from 'react' +import pageStyles from './PageContent.module.css' + +interface PageTitleProps { + children: ReactNode + /** English accent shown after a bullet (e.g. USERS). */ + en?: string +} + +export function PageTitle({ children, en }: PageTitleProps) { + return ( +

+ {children} + {en ? {en} : null} +

+ ) +} diff --git a/apps/super-admin/src/pages/BusinessesPage.module.css b/apps/super-admin/src/pages/BusinessesPage.module.css index 219cff3..d3d2b7c 100644 --- a/apps/super-admin/src/pages/BusinessesPage.module.css +++ b/apps/super-admin/src/pages/BusinessesPage.module.css @@ -9,10 +9,7 @@ } .filtersTitle { - font-size: 14px; - font-weight: 700; - color: var(--text-primary); - margin-bottom: 10px; + display: none; } .filtersGrid { diff --git a/apps/super-admin/src/pages/UsersPage.module.css b/apps/super-admin/src/pages/UsersPage.module.css index 60ae014..2f7844d 100644 --- a/apps/super-admin/src/pages/UsersPage.module.css +++ b/apps/super-admin/src/pages/UsersPage.module.css @@ -68,6 +68,10 @@ cursor: pointer; } +.roleOption input[type='radio'] { + accent-color: var(--primary); +} + .roleOption:has(input:checked) { border-color: rgba(var(--primary-rgb) / 0.35); background: rgba(var(--primary-rgb) / 0.08); diff --git a/apps/super-admin/src/pages/UsersPage.tsx b/apps/super-admin/src/pages/UsersPage.tsx index ecbfb40..be6a5ce 100644 --- a/apps/super-admin/src/pages/UsersPage.tsx +++ b/apps/super-admin/src/pages/UsersPage.tsx @@ -46,7 +46,7 @@ const TEAM_ROLE_ORDER = ['admin', 'editor', 'viewer'] as const const TEAM_ROLE_LABELS: Record = { admin: 'Admin', editor: 'Editor', - viewer: 'Viewer', + viewer: 'Observer', } function teamRoleLabel(slug: string | null | undefined, teamRoles: RoleOption[]) { @@ -1021,8 +1021,7 @@ export function UsersPage() { {businessAccess === 'staff' ? ( <>

- Only a super admin can assign Admin. Admins can assign Editor or Viewer. Admins - cannot change other admins. + Only a super admin can assign Admin. Admins can assign Editor or Observer.

{orderedTeamRoles.map((role) => (