diff --git a/apps/web/src/components/pipeline/PipelineList.vue b/apps/web/src/components/pipeline/PipelineList.vue
index a62c119..bb19c48 100644
--- a/apps/web/src/components/pipeline/PipelineList.vue
+++ b/apps/web/src/components/pipeline/PipelineList.vue
@@ -1,5 +1,5 @@
-
+
{{ copy.empty }}
-
+
-
+
@@ -60,7 +81,7 @@ const tableKey = computed(() => (hideAmount.value ? 'pipeline.leads' : 'pipeline
| مرحله |
مبلغ |
تاریخ |
- |
+
@@ -155,7 +176,7 @@ const tableKey = computed(() => (hideAmount.value ? 'pipeline.leads' : 'pipeline
-
+
(hideAmount.value ? 'pipeline.leads' : 'pipeline
white-space: nowrap;
}
+.menu-col,
.menu-cell {
- width: 2.5rem;
+ width: 3.2rem;
+ min-width: 3.2rem;
+ text-align: center;
}
.menu {
border: 0;
background: transparent;
color: var(--muted);
- padding: 0.2rem;
+ width: 2rem;
+ height: 2rem;
+ padding: 0;
border-radius: var(--radius);
+ display: inline-grid;
+ place-items: center;
cursor: pointer;
}
@@ -442,7 +470,7 @@ const tableKey = computed(() => (hideAmount.value ? 'pipeline.leads' : 'pipeline
}
.cards {
- display: none;
+ display: grid;
gap: 0.7rem;
}
@@ -479,13 +507,4 @@ const tableKey = computed(() => (hideAmount.value ? 'pipeline.leads' : 'pipeline
gap: 0.5rem;
}
-@container pipeline (max-width: 720px) {
- .table-wrap {
- display: none;
- }
-
- .cards {
- display: grid;
- }
-}
diff --git a/apps/web/src/lib/anchored-menu.ts b/apps/web/src/lib/anchored-menu.ts
index dd5048d..0e244d0 100644
--- a/apps/web/src/lib/anchored-menu.ts
+++ b/apps/web/src/lib/anchored-menu.ts
@@ -7,19 +7,33 @@ export function cardMenuStyle(
const buttons = Array.from(
document.querySelectorAll(`[data-card-id="${CSS.escape(cardId)}"] .menu`),
);
- // در نمای لیست هم جدول و هم کارت در DOM هستند؛ دکمهٔ واقعاً دیده را بگیر
const btn =
buttons.find((el) => {
const r = el.getBoundingClientRect();
- return r.width > 0 && r.height > 0;
- }) ?? buttons[0];
+ if (r.width < 1 || r.height < 1) return false;
+ let node: HTMLElement | null = el;
+ while (node) {
+ const style = getComputedStyle(node);
+ if (style.display === 'none' || style.visibility === 'hidden') return false;
+ node = node.parentElement;
+ }
+ return true;
+ }) ?? null;
if (!btn) return null;
const r = btn.getBoundingClientRect();
const gap = 4;
const left = Math.min(Math.max(8, r.left), window.innerWidth - width - 8);
const fitsBelow = r.bottom + gap + height <= window.innerHeight;
const top = fitsBelow ? r.bottom + gap : Math.max(8, r.top - height - gap);
- return { inset: 'auto', top: `${top}px`, left: `${left}px`, minWidth: `${width}px` };
+ // inset را ست نکن؛ shorthand مقدار top/left را خنثی میکند
+ return {
+ position: 'fixed',
+ top: `${top}px`,
+ left: `${left}px`,
+ right: 'auto',
+ bottom: 'auto',
+ minWidth: `${width}px`,
+ };
}
/** بستن منو با کلیک بیرون، Escape یا اسکرول */
diff --git a/apps/web/src/views/ActivitiesView.vue b/apps/web/src/views/ActivitiesView.vue
index d26f274..dad8ca4 100644
--- a/apps/web/src/views/ActivitiesView.vue
+++ b/apps/web/src/views/ActivitiesView.vue
@@ -1,5 +1,5 @@