{renewal.dateLabel}
{renewal.daysLabel ? (
-
- {renewal.daysLabel}
-
+
+
+ {renewal.daysLabel}
+
+
+
) : null}
diff --git a/apps/super-admin/src/utils/lockBodyScroll.ts b/apps/super-admin/src/utils/lockBodyScroll.ts
new file mode 100644
index 0000000..02dc90c
--- /dev/null
+++ b/apps/super-admin/src/utils/lockBodyScroll.ts
@@ -0,0 +1,19 @@
+/** Nested-modal-safe body scroll lock. Restoring a captured overflow value
+ * leaves `overflow: hidden` on body after overlapping dialogs close. */
+let lockCount = 0
+
+export function lockBodyScroll() {
+ lockCount += 1
+ if (lockCount === 1) {
+ document.documentElement.style.overflow = 'hidden'
+ document.body.style.overflow = 'hidden'
+ }
+}
+
+export function unlockBodyScroll() {
+ lockCount = Math.max(0, lockCount - 1)
+ if (lockCount === 0) {
+ document.documentElement.style.overflow = ''
+ document.body.style.overflow = ''
+ }
+}
diff --git a/docs/PROJECT_CONTEXT.md b/docs/PROJECT_CONTEXT.md
index 2acbe0d..60d290b 100644
--- a/docs/PROJECT_CONTEXT.md
+++ b/docs/PROJECT_CONTEXT.md
@@ -3,7 +3,7 @@
> **For AI agents:** Read this file at the start of a new chat before making changes.
> Update this document when a major feature is completed or architecture changes.
-Last updated: August 21, 2026
+Last updated: August 31, 2026
---
@@ -471,7 +471,7 @@ Match **Super Admin** compact field sizing across all dashboards — see `.curso
Global input sizing lives in `packages/dashboard-core/src/styles/tokens.css` (customer) and each app’s `index.css` (business / super-admin). Change password → shared `PasswordResetModal` from `@meshkee/dashboard-ui`.
- **Farsi text:** Customer app → Yekan Bakh (`src/fonts/yekanbakh.css`); business/super-admin → IranYekan (`iranyekan.css`). `--font-en` / `--font-fa` are named faces only; `--font-ui` appends system fallbacks. Self-host files in `public/fonts/` — see `.cursor/rules/ui-farsi-fonts.mdc`
-- **Per-business theme:** Super Admin sets `branding.primaryColor`; business app applies via `BusinessThemeProvider`
+- **Per-business theme:** Super Admin sets `branding.primaryColor` and `branding.themeMode` (`light` \| `dark`); business + customer dashboards apply both via their theme providers (`data-theme` on ``). Dark mode uses neutral gray surfaces; `--primary` stays for accents only.
- **Per-business modules:** Super Admin **Modules** column on Businesses list; stored in `settings.modules.enabled` (business + customer sections); business Home + Sidebar hide disabled business modules; `customer_products` gates customer My Products (`/my-products`, `/my-products/new`) which call `businesses/:id/my-user-products`
- **RTL:** Farsi inputs use `dir="rtl"` and the app’s `--font-fa`
- **IRT prices:** comma-separated thousands + `IRT` suffix — see `.cursor/rules/ui-irt-price.mdc`
diff --git a/packages/dashboard-ui/src/components/AddressListEditor.module.css b/packages/dashboard-ui/src/components/AddressListEditor.module.css
index b912f50..7b6a0b2 100644
--- a/packages/dashboard-ui/src/components/AddressListEditor.module.css
+++ b/packages/dashboard-ui/src/components/AddressListEditor.module.css
@@ -53,7 +53,7 @@
font-size: var(--field-font-size);
border: 1px solid rgba(148, 163, 184, 0.35);
border-radius: var(--radius-sm);
- background-color: rgba(255, 255, 255, 0.7);
+ background-color: var(--surface);
}
.selectField {
diff --git a/packages/dashboard-ui/src/components/PasswordResetModal.module.css b/packages/dashboard-ui/src/components/PasswordResetModal.module.css
index 43d5ba3..930dde0 100644
--- a/packages/dashboard-ui/src/components/PasswordResetModal.module.css
+++ b/packages/dashboard-ui/src/components/PasswordResetModal.module.css
@@ -16,7 +16,7 @@
width: 100%;
max-width: 440px;
padding: 28px 28px 24px;
- background: rgba(255, 255, 255, 0.88);
+ background: var(--elevated-surface);
backdrop-filter: blur(28px);
-webkit-backdrop-filter: blur(28px);
border: 1px solid var(--glass-border);
@@ -65,7 +65,7 @@
font-family: var(--font-ui);
line-height: 1.4;
color: var(--text-primary);
- background: rgba(255, 255, 255, 0.75);
+ background: var(--surface);
border: 1px solid rgba(148, 163, 184, 0.35);
border-radius: var(--radius-sm);
outline: none;
@@ -101,12 +101,24 @@
color: #b91c1c;
}
+:global(html[data-theme='dark']) .error {
+ color: #fecaca;
+ background: rgba(239, 68, 68, 0.16);
+ border-color: rgba(248, 113, 113, 0.45);
+}
+
.success {
background: rgba(34, 197, 94, 0.08);
border: 1px solid rgba(34, 197, 94, 0.25);
color: #15803d;
}
+:global(html[data-theme='dark']) .success {
+ color: #bbf7d0;
+ background: rgba(34, 197, 94, 0.16);
+ border-color: rgba(74, 222, 128, 0.4);
+}
+
.actions {
display: flex;
gap: 10px;
diff --git a/packages/dashboard-ui/src/components/RichTextEditor.module.css b/packages/dashboard-ui/src/components/RichTextEditor.module.css
index 86d0c6a..d1b085c 100644
--- a/packages/dashboard-ui/src/components/RichTextEditor.module.css
+++ b/packages/dashboard-ui/src/components/RichTextEditor.module.css
@@ -4,7 +4,7 @@
min-width: 0;
border: 1px solid rgba(148, 163, 184, 0.35);
border-radius: var(--radius-sm);
- background: rgba(255, 255, 255, 0.7);
+ background: var(--surface);
overflow: visible;
transition: border-color 0.2s, box-shadow 0.2s;
box-sizing: border-box;
@@ -22,7 +22,7 @@
gap: 2px;
padding: 4px 6px;
border-bottom: 1px solid rgba(148, 163, 184, 0.2);
- background: rgba(248, 250, 252, 0.8);
+ background: var(--elevated-surface);
position: relative;
z-index: 2;
}
@@ -110,7 +110,7 @@
padding: 10px;
border: 1px solid rgba(148, 163, 184, 0.35);
border-radius: var(--radius-sm);
- background: rgba(255, 255, 255, 0.98);
+ background: var(--elevated-surface);
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
}
@@ -142,7 +142,7 @@
padding: var(--field-padding-y) var(--field-padding-x);
border: 1px solid rgba(148, 163, 184, 0.35);
border-radius: var(--radius-sm);
- background: rgba(255, 255, 255, 0.9);
+ background: var(--elevated-surface);
font-size: var(--field-font-size);
font-family: var(--font-ui);
color: var(--text-primary);
diff --git a/packages/dashboard-ui/src/context/Toast.module.css b/packages/dashboard-ui/src/context/Toast.module.css
index 7d71701..49d77d1 100644
--- a/packages/dashboard-ui/src/context/Toast.module.css
+++ b/packages/dashboard-ui/src/context/Toast.module.css
@@ -19,7 +19,7 @@
font-weight: 500;
line-height: 1.4;
color: var(--text-primary);
- background: var(--toast-bg, rgba(255, 255, 255, 0.94));
+ background: var(--toast-bg, var(--elevated-surface));
backdrop-filter: blur(var(--blur-glass));
-webkit-backdrop-filter: blur(var(--blur-glass));
border: 1px solid var(--glass-border);