diff --git a/resources/scripts-v2/components/base/BaseCustomTag.vue b/resources/scripts-v2/components/base/BaseCustomTag.vue
new file mode 100644
index 00000000..e160a919
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseCustomTag.vue
@@ -0,0 +1,16 @@
+
diff --git a/resources/scripts-v2/components/base/BaseCustomerSelectInput.vue b/resources/scripts-v2/components/base/BaseCustomerSelectInput.vue
new file mode 100644
index 00000000..3fe2dc85
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseCustomerSelectInput.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+ {{ $t('customers.add_new_customer') }}
+
+
+
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseDescriptionList.vue b/resources/scripts-v2/components/base/BaseDescriptionList.vue
new file mode 100644
index 00000000..bae2f631
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseDescriptionList.vue
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseDescriptionListItem.vue b/resources/scripts-v2/components/base/BaseDescriptionListItem.vue
new file mode 100644
index 00000000..2a2de0fe
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseDescriptionListItem.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ label }}
+
+
+
+ {{ value }}
+
+
+
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseEstimateStatusLabel.vue b/resources/scripts-v2/components/base/BaseEstimateStatusLabel.vue
new file mode 100644
index 00000000..90b97a77
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseEstimateStatusLabel.vue
@@ -0,0 +1,44 @@
+
+
+
+ {{ labelStatus }}
+
diff --git a/resources/scripts-v2/components/base/BaseFormatMoney.vue b/resources/scripts-v2/components/base/BaseFormatMoney.vue
new file mode 100644
index 00000000..000bba35
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseFormatMoney.vue
@@ -0,0 +1,27 @@
+
+
+
+ {{ formattedAmount }}
+
diff --git a/resources/scripts-v2/components/base/BaseHeading.vue b/resources/scripts-v2/components/base/BaseHeading.vue
new file mode 100644
index 00000000..feb47254
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseHeading.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseInvoiceStatusLabel.vue b/resources/scripts-v2/components/base/BaseInvoiceStatusLabel.vue
new file mode 100644
index 00000000..ec839a72
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseInvoiceStatusLabel.vue
@@ -0,0 +1,51 @@
+
+
+
+ {{ labelStatus }}
+
diff --git a/resources/scripts-v2/components/base/BaseLabel.vue b/resources/scripts-v2/components/base/BaseLabel.vue
new file mode 100644
index 00000000..2b5671d1
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseLabel.vue
@@ -0,0 +1,5 @@
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseRating.vue b/resources/scripts-v2/components/base/BaseRating.vue
new file mode 100644
index 00000000..75c07537
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseRating.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseRecurringInvoiceStatusLabel.vue b/resources/scripts-v2/components/base/BaseRecurringInvoiceStatusLabel.vue
new file mode 100644
index 00000000..ba4942a8
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseRecurringInvoiceStatusLabel.vue
@@ -0,0 +1,35 @@
+
+
+
+ {{ labelStatus }}
+
diff --git a/resources/scripts-v2/components/base/BaseScrollPane.vue b/resources/scripts-v2/components/base/BaseScrollPane.vue
new file mode 100644
index 00000000..45e14994
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseScrollPane.vue
@@ -0,0 +1,11 @@
+
+
+
diff --git a/resources/scripts-v2/components/base/BaseSpinner.vue b/resources/scripts-v2/components/base/BaseSpinner.vue
new file mode 100644
index 00000000..5ce2098f
--- /dev/null
+++ b/resources/scripts-v2/components/base/BaseSpinner.vue
@@ -0,0 +1,22 @@
+
+
+
diff --git a/resources/scripts-v2/components/base/index.ts b/resources/scripts-v2/components/base/index.ts
index f7c050ed..6f1234ca 100644
--- a/resources/scripts-v2/components/base/index.ts
+++ b/resources/scripts-v2/components/base/index.ts
@@ -3,29 +3,41 @@ export { default as BaseButton } from './BaseButton.vue'
export { default as BaseCard } from './BaseCard.vue'
export { default as BaseCheckbox } from './BaseCheckbox.vue'
export { default as BaseCustomerAddressDisplay } from './BaseCustomerAddressDisplay.vue'
+export { default as BaseCustomerSelectInput } from './BaseCustomerSelectInput.vue'
export { default as BaseCustomerSelectPopup } from './BaseCustomerSelectPopup.vue'
export { default as BaseCustomInput } from './BaseCustomInput.vue'
export { default as BaseDatePicker } from './BaseDatePicker.vue'
+export { default as BaseDescriptionList } from './BaseDescriptionList.vue'
+export { default as BaseDescriptionListItem } from './BaseDescriptionListItem.vue'
export { default as BaseDialog } from './BaseDialog.vue'
export { default as BaseDivider } from './BaseDivider.vue'
export { default as BaseDropdown } from './BaseDropdown.vue'
export { default as BaseDropdownItem } from './BaseDropdownItem.vue'
export { default as BaseErrorAlert } from './BaseErrorAlert.vue'
+export { default as BaseEstimateStatusLabel } from './BaseEstimateStatusLabel.vue'
export { default as BaseFileUploader } from './BaseFileUploader.vue'
+export { default as BaseFormatMoney } from './BaseFormatMoney.vue'
export { default as BaseGlobalLoader } from './BaseGlobalLoader.vue'
+export { default as BaseHeading } from './BaseHeading.vue'
export { default as BaseIcon } from './BaseIcon.vue'
export { default as BaseInfoAlert } from './BaseInfoAlert.vue'
export { default as BaseInput } from './BaseInput.vue'
+export { default as BaseInvoiceStatusLabel } from './BaseInvoiceStatusLabel.vue'
export { default as BaseItemSelect } from './BaseItemSelect.vue'
+export { default as BaseLabel } from './BaseLabel.vue'
export { default as BaseList } from './BaseList.vue'
export { default as BaseListItem } from './BaseListItem.vue'
export { default as BaseMoney } from './BaseMoney.vue'
export { default as BaseModal } from './BaseModal.vue'
export { default as BaseMultiselect } from './BaseMultiselect.vue'
export { default as BaseRadio } from './BaseRadio.vue'
+export { default as BaseRating } from './BaseRating.vue'
+export { default as BaseRecurringInvoiceStatusLabel } from './BaseRecurringInvoiceStatusLabel.vue'
+export { default as BaseScrollPane } from './BaseScrollPane.vue'
export { default as BaseSelectAction } from './BaseSelectAction.vue'
export { default as BaseSelectInput } from './BaseSelectInput.vue'
export { default as BaseSettingCard } from './BaseSettingCard.vue'
+export { default as BaseSpinner } from './BaseSpinner.vue'
export { default as BaseSwitch } from './BaseSwitch.vue'
export { default as BaseTabGroup } from './BaseTabGroup.vue'
export { default as BaseText } from './BaseText.vue'
diff --git a/resources/scripts-v2/global-components.ts b/resources/scripts-v2/global-components.ts
index 4d5f1800..23ee2d92 100644
--- a/resources/scripts-v2/global-components.ts
+++ b/resources/scripts-v2/global-components.ts
@@ -50,4 +50,64 @@ export function defineGlobalComponents(app: App): void {
'BaseEditor',
defineAsyncComponent(() => import('./components/editor/RichEditor.vue'))
)
+
+ // ---------------------------------------------------------------------------
+ // Alias registrations: map old Base* names to new v2 components so that
+ // templates using the legacy names continue to resolve correctly.
+ // ---------------------------------------------------------------------------
+
+ // Form
+ const FormGroup = () => import('./components/form/FormGroup.vue')
+ const FormGrid = () => import('./components/form/FormGrid.vue')
+ const SwitchSection = () => import('./components/form/SwitchSection.vue')
+
+ app.component('BaseInputGroup', defineAsyncComponent(FormGroup))
+ app.component('BaseInputGrid', defineAsyncComponent(FormGrid))
+ app.component('BaseSwitchSection', defineAsyncComponent(SwitchSection))
+
+ // Layout
+ const Page = () => import('./components/layout/Page.vue')
+ const PageHeader = () => import('./components/layout/PageHeader.vue')
+ const Breadcrumb = () => import('./components/layout/Breadcrumb.vue')
+ const BreadcrumbItem = () => import('./components/layout/BreadcrumbItem.vue')
+ const FilterWrapper = () => import('./components/layout/FilterWrapper.vue')
+ const EmptyPlaceholder = () => import('./components/layout/EmptyPlaceholder.vue')
+ const ContentPlaceholder = () => import('./components/layout/ContentPlaceholder.vue')
+ const ContentPlaceholderBox = () => import('./components/layout/ContentPlaceholderBox.vue')
+ const ContentPlaceholderText = () => import('./components/layout/ContentPlaceholderText.vue')
+ const ContentPlaceholderHeading = () => import('./components/layout/ContentPlaceholderHeading.vue')
+ app.component('BasePage', defineAsyncComponent(Page))
+ app.component('BasePageHeader', defineAsyncComponent(PageHeader))
+ app.component('BaseBreadcrumb', defineAsyncComponent(Breadcrumb))
+ app.component('BaseBreadcrumbItem', defineAsyncComponent(BreadcrumbItem))
+ app.component('BaseFilterWrapper', defineAsyncComponent(FilterWrapper))
+ app.component('BaseEmptyPlaceholder', defineAsyncComponent(EmptyPlaceholder))
+ app.component('BaseContentPlaceholders', defineAsyncComponent(ContentPlaceholder))
+ app.component('BaseContentPlaceholdersBox', defineAsyncComponent(ContentPlaceholderBox))
+ app.component('BaseContentPlaceholdersText', defineAsyncComponent(ContentPlaceholderText))
+ app.component('BaseContentPlaceholdersHeading', defineAsyncComponent(ContentPlaceholderHeading))
+
+ // Table
+ const TablePagination = () => import('./components/table/TablePagination.vue')
+
+ app.component('BaseTablePagination', defineAsyncComponent(TablePagination))
+
+ // Notifications
+ const NotificationRoot = () => import('./components/notifications/NotificationRoot.vue')
+ const NotificationItem = () => import('./components/notifications/NotificationItem.vue')
+
+ app.component('NotificationRoot', defineAsyncComponent(NotificationRoot))
+ app.component('NotificationItem', defineAsyncComponent(NotificationItem))
+
+ // Status badge aliases (map old Base* prefix names to the already eager-loaded
+ // components from ./components/base/*.vue)
+ const invoiceStatusBadge = components['./components/base/InvoiceStatusBadge.vue']
+ const estimateStatusBadge = components['./components/base/EstimateStatusBadge.vue']
+ const paidStatusBadge = components['./components/base/PaidStatusBadge.vue']
+ const recurringInvoiceStatusBadge = components['./components/base/RecurringInvoiceStatusBadge.vue']
+
+ if (invoiceStatusBadge) app.component('BaseInvoiceStatusBadge', invoiceStatusBadge.default)
+ if (estimateStatusBadge) app.component('BaseEstimateStatusBadge', estimateStatusBadge.default)
+ if (paidStatusBadge) app.component('BasePaidStatusBadge', paidStatusBadge.default)
+ if (recurringInvoiceStatusBadge) app.component('BaseRecurringInvoiceStatusBadge', recurringInvoiceStatusBadge.default)
}