diff --git a/apps/admin-panel/src/components/common/BaseFormModal.vue b/apps/admin-panel/src/components/common/BaseFormModal.vue
new file mode 100644
index 0000000..8d516c6
--- /dev/null
+++ b/apps/admin-panel/src/components/common/BaseFormModal.vue
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/admin-panel/src/components/common/ListPageHeader.vue b/apps/admin-panel/src/components/common/ListPageHeader.vue
new file mode 100644
index 0000000..426aa02
--- /dev/null
+++ b/apps/admin-panel/src/components/common/ListPageHeader.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
diff --git a/apps/admin-panel/src/components/icons.ts b/apps/admin-panel/src/components/icons.ts
new file mode 100644
index 0000000..42f05b2
--- /dev/null
+++ b/apps/admin-panel/src/components/icons.ts
@@ -0,0 +1,81 @@
+// Shared legacy-Feather-name -> ant-design-vue icon map.
+//
+// Originally lived only inside TooltipBtn.vue (row-action icons). Extracted
+// here so the sidebar (navMenuItems.ts icon: values) can resolve the SAME
+// names through the SAME map instead of duplicating it — one source of
+// truth for "legacy Feather icon name" -> "ant component" across the app.
+import {
+ AppstoreOutlined,
+ BarChartOutlined,
+ BellOutlined,
+ BlockOutlined,
+ BookOutlined,
+ CameraOutlined,
+ CheckOutlined,
+ CloseOutlined,
+ CreditCardOutlined,
+ DeleteOutlined,
+ DollarOutlined,
+ EditOutlined,
+ EyeOutlined,
+ FileOutlined,
+ FileTextOutlined,
+ GiftOutlined,
+ HomeOutlined,
+ InboxOutlined,
+ MailOutlined,
+ MessageOutlined,
+ PercentageOutlined,
+ PlusOutlined,
+ SettingOutlined,
+ ShoppingOutlined,
+ StopOutlined,
+ TeamOutlined,
+ UnorderedListOutlined,
+ UserAddOutlined,
+ UserOutlined,
+} from '@ant-design/icons-vue';
+
+/** legacy Feather name -> ant component. */
+export const ICONS: Record = {
+ // row-action icons (TooltipBtn.vue's original set)
+ ListIcon: UnorderedListOutlined,
+ FileIcon: FileOutlined,
+ TrashIcon: DeleteOutlined,
+ EditIcon: EditOutlined,
+ CheckIcon: CheckOutlined,
+ CameraIcon: CameraOutlined,
+ EyeIcon: EyeOutlined,
+ PlusIcon: PlusOutlined,
+ XIcon: CloseOutlined,
+ FileTextIcon: FileTextOutlined,
+
+ // sidebar icons (navMenuItems.ts), added when the sidebar started
+ // rendering them for the first time
+ HomeIcon: HomeOutlined,
+ PackageIcon: InboxOutlined,
+ UserIcon: UserOutlined,
+ UsersIcon: TeamOutlined,
+ UserPlusIcon: UserAddOutlined,
+ ShoppingBagIcon: ShoppingOutlined,
+ BoxIcon: InboxOutlined,
+ GridIcon: AppstoreOutlined,
+ LayersIcon: BlockOutlined,
+ CreditCardIcon: CreditCardOutlined,
+ DollarSignIcon: DollarOutlined,
+ PercentIcon: PercentageOutlined,
+ GiftIcon: GiftOutlined,
+ SlashIcon: StopOutlined,
+ BookIcon: BookOutlined,
+ MessageSquareIcon: MessageOutlined,
+ MailIcon: MailOutlined,
+ BellIcon: BellOutlined,
+ BarChartIcon: BarChartOutlined,
+ SettingsIcon: SettingOutlined,
+ InboxIcon: InboxOutlined,
+};
+
+export function resolveIcon(name: string | undefined): unknown | undefined {
+ if (!name) return undefined;
+ return ICONS[name];
+}
diff --git a/apps/admin-panel/src/components/tooltip-btn/TooltipBtn.vue b/apps/admin-panel/src/components/tooltip-btn/TooltipBtn.vue
index 921a926..42ee035 100644
--- a/apps/admin-panel/src/components/tooltip-btn/TooltipBtn.vue
+++ b/apps/admin-panel/src/components/tooltip-btn/TooltipBtn.vue
@@ -5,8 +5,9 @@
it confirms first, without it fires immediately.
Legacy rendered . vue-feather has no Vue 3
- build, so the feather NAME is mapped to an ant-design icon here. Ported views
- keep writing icon="ListIcon" unchanged.
+ build, so the feather NAME is mapped to an ant-design icon via the shared
+ map in components/icons.ts (also used by the sidebar). Ported views keep
+ writing icon="ListIcon" unchanged.
-->
@@ -33,18 +34,8 @@
diff --git a/apps/admin-panel/src/views/finical/list.vue b/apps/admin-panel/src/views/finical/list.vue
index 2ca8934..716dffb 100644
--- a/apps/admin-panel/src/views/finical/list.vue
+++ b/apps/admin-panel/src/views/finical/list.vue
@@ -64,7 +64,7 @@