diff --git a/assets/admin/components/SessionStepper.test.tsx b/assets/admin/components/SessionStepper.test.tsx
new file mode 100644
index 00000000..924e13cd
--- /dev/null
+++ b/assets/admin/components/SessionStepper.test.tsx
@@ -0,0 +1,35 @@
+import { describe, it, expect } from 'vitest';
+import { render, screen } from '@testing-library/react';
+import SessionStepper from './SessionStepper';
+
+const STEPS = ['ایجاد سرویس', 'پرداخت', 'جزییات'];
+
+describe('SessionStepper', () => {
+ it('برچسب همه گامها و یک کانکتور بهازای هر گام غیر از اولی', () => {
+ render();
+ STEPS.forEach((l) => expect(screen.getByText(l)).toBeInTheDocument());
+ expect(screen.getByTestId('step-connector-1')).toBeInTheDocument();
+ expect(screen.getByTestId('step-connector-2')).toBeInTheDocument();
+ expect(screen.queryByTestId('step-connector-0')).not.toBeInTheDocument();
+ });
+
+ it('کانکتور سمت گامِ قبلی (راست در RTL) کشیده میشود، نه بیرون از لبه چپ', () => {
+ render();
+ const c = screen.getByTestId('step-connector-2');
+ // RTL: امتداد به سمت راست (گام قبلی) → left مثبت از مرکز، right منفی
+ expect(c.style.left).toBe('calc(50% + 40px)');
+ expect(c.style.right).toBe('calc(-50% + 40px)');
+ });
+
+ it('کانکتور گامهای طیشده بنفش و بقیه خاکستری', () => {
+ render();
+ // jsdom رنگ hex را به rgb نرمال میکند
+ expect(screen.getByTestId('step-connector-1').style.background).toContain('rgb(85, 89, 206)');
+ expect(screen.getByTestId('step-connector-2').style.background).toContain('rgb(234, 234, 240)');
+ });
+
+ it('استپر خالی: بدون کرش و بدون کانکتور', () => {
+ const { container } = render();
+ expect(container.querySelectorAll('[data-testid^="step-connector"]').length).toBe(0);
+ });
+});
diff --git a/assets/admin/components/SessionStepper.tsx b/assets/admin/components/SessionStepper.tsx
index d9871114..6c01da12 100644
--- a/assets/admin/components/SessionStepper.tsx
+++ b/assets/admin/components/SessionStepper.tsx
@@ -41,12 +41,13 @@ export default function SessionStepper({ activeStep = 0, steps = [] }: { activeS
{steps.map((label, i) => (
- {/* connector to previous step (tauri ColorlibConnector: top 22, h 3, marginX 40) */}
+ {/* connector to previous step (tauri ColorlibConnector: top 22, h 3, marginX 40).
+ صفحه RTL است و گامِ قبلی سمت راست میافتد؛ MUI در tauri این را خودش flip میکرد. */}
{i > 0 && (
setTime(e.target.value)}
diff --git a/assets/admin/styles.css b/assets/admin/styles.css
index 25810ad7..d88ef70d 100644
--- a/assets/admin/styles.css
+++ b/assets/admin/styles.css
@@ -952,3 +952,8 @@ html, body { max-width: 100%; overflow-x: hidden; }
.dark .inv-table td { border-color: var(--border); }
.inv-table tbody tr:hover { background: #f4f5fd; }
.dark .inv-table tbody tr:hover { background: var(--surface-2); }
+
+/* input[type=time] با آیکون سفارشی (گام «ایجاد سرویس»): آیکون native مرورگر حذف
+ میشود تا ساعت دوتایی نشود — مثل مبدأ tauri که فقط یک ClockField دارد. */
+.time-input-plain::-webkit-calendar-picker-indicator { display: none; }
+.time-input-plain { appearance: none; -webkit-appearance: none; }