\ No newline at end of file
+
diff --git a/components/object/preview-modal.vue b/components/object/preview-modal.vue
index 26c72dc..ef1eb56 100644
--- a/components/object/preview-modal.vue
+++ b/components/object/preview-modal.vue
@@ -1,13 +1,7 @@
-
-
-
- {{ t('Close') }}
-
-
-
+
@@ -23,7 +17,7 @@
{{ t('Your browser does not support the audio tag') }}
-
-
\ No newline at end of file
+
diff --git a/components/replication/new-form.vue b/components/replication/new-form.vue
index a0cd6a3..e148cad 100644
--- a/components/replication/new-form.vue
+++ b/components/replication/new-form.vue
@@ -6,7 +6,7 @@
:close-on-backdrop="false"
>
-
+
@@ -77,15 +77,15 @@
-
+
-
+
{{ t('Use TLS') }}
{{ t('Enable secure transport when connecting to endpoint.') }}
-
+
@@ -93,7 +93,7 @@
{{ t('Replicate Existing Objects') }}
{{ t('Include objects that already exist in the source bucket.') }}
-
+
@@ -101,7 +101,7 @@
{{ t('Replicate Delete Markers') }}
{{ t('Sync delete markers to destination bucket.') }}
-
+
@@ -122,7 +122,7 @@
-
+
@@ -139,8 +139,9 @@ import { Input } from '@/components/ui/input'
import { Button } from '@/components/ui/button'
import { Icon } from '#components'
-import { AppCard, AppModal, AppSelect, AppSwitch } from '@/components/app'
+import { AppModal, AppSelect } from '@/components/app'
import { Label } from '@/components/ui/label'
+import { Switch } from '@/components/ui/switch'
import { computed, reactive, ref } from 'vue'
import { useI18n } from 'vue-i18n'
import { getBytes } from '@/utils/functions'
@@ -357,4 +358,4 @@ defineExpose({
visible.value = true
},
})
-
\ No newline at end of file
+
diff --git a/components/tiers/change-key.vue b/components/tiers/change-key.vue
index 22dc986..c4cec04 100644
--- a/components/tiers/change-key.vue
+++ b/components/tiers/change-key.vue
@@ -5,7 +5,7 @@
size="md"
:close-on-backdrop="false"
>
-
+
@@ -15,7 +15,7 @@
-
+
@@ -30,7 +30,7 @@
import { Input } from '@/components/ui/input'
import { Button } from '@/components/ui/button'
-import { AppCard, AppModal } from '@/components/app'
+import { AppModal } from '@/components/app'
import { Label } from '@/components/ui/label'
import { computed, reactive, ref, watch } from 'vue'
import { useI18n } from 'vue-i18n'
@@ -104,4 +104,4 @@ const submitForm = async () => {
submitting.value = false
}
}
-
\ No newline at end of file
+
diff --git a/components/tiers/new-form.vue b/components/tiers/new-form.vue
index 201756f..31b80b8 100644
--- a/components/tiers/new-form.vue
+++ b/components/tiers/new-form.vue
@@ -2,7 +2,7 @@
- {{ item.description }}
-
+
-
+
@@ -27,9 +27,9 @@
{{ formData.type }}
-
+
-
+
{{ t('Storage Class') }}
-
+
@@ -94,7 +94,7 @@
import { Input } from '@/components/ui/input'
import { Button } from '@/components/ui/button'
-import { AppCard, AppModal } from '@/components/app'
+import { AppModal } from '@/components/app'
import { Label } from '@/components/ui/label'
import { computed, reactive, ref } from 'vue'
import { useI18n } from 'vue-i18n'
@@ -217,4 +217,4 @@ defineExpose({
resetForm()
},
})
-
\ No newline at end of file
+
diff --git a/components/users/group-edit.vue b/components/users/group-edit.vue
index f28f694..633d980 100644
--- a/components/users/group-edit.vue
+++ b/components/users/group-edit.vue
@@ -1,9 +1,9 @@
-
+
{{ t('Status') }}
-
+
@@ -19,12 +19,13 @@
-
+
\ No newline at end of file
+
diff --git a/components/users/group/set-policies-mutiple.vue b/components/users/group/set-policies-mutiple.vue
index 487905d..7a26f0b 100644
--- a/components/users/group/set-policies-mutiple.vue
+++ b/components/users/group/set-policies-mutiple.vue
@@ -1,6 +1,6 @@
-
+
@@ -42,7 +42,7 @@
-
+
@@ -50,7 +50,7 @@
import { Input } from '@/components/ui/input'
import { Button } from '@/components/ui/button'
-import { AppCard, AppCheckbox, AppModal } from '@/components/app'
+import { AppCheckbox, AppModal } from '@/components/app'
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'
import { computed, ref } from 'vue'
import { useI18n } from 'vue-i18n'
@@ -155,4 +155,4 @@ const changePolicies = async () => {
defineExpose({
openDialog,
})
-
\ No newline at end of file
+
diff --git a/components/users/user-edit.vue b/components/users/user-edit.vue
index 05b7b4c..ea9000a 100644
--- a/components/users/user-edit.vue
+++ b/components/users/user-edit.vue
@@ -1,9 +1,9 @@
-
+
{{ t('Status') }}
-
+
@@ -25,12 +25,13 @@
-
+
\ No newline at end of file
+
diff --git a/components/users/user/acedit.vue b/components/users/user/acedit.vue
index efbd9fd..0b67ee5 100644
--- a/components/users/user/acedit.vue
+++ b/components/users/user/acedit.vue
@@ -1,5 +1,5 @@
-
+
@@ -35,7 +35,7 @@
{{ t('Automatically inherit the main account policy when enabled.') }}
-
+
\ No newline at end of file
+
diff --git a/components/users/user/groups.vue b/components/users/user/groups.vue
index 8f1c1d1..26f50c7 100644
--- a/components/users/user/groups.vue
+++ b/components/users/user/groups.vue
@@ -1,5 +1,5 @@
-
+
@@ -84,14 +84,13 @@
-
+
\ No newline at end of file
+
diff --git a/components/users/user/new.vue b/components/users/user/new.vue
index 398701c..bd00564 100644
--- a/components/users/user/new.vue
+++ b/components/users/user/new.vue
@@ -1,6 +1,6 @@
-
+
@@ -103,7 +103,7 @@
{{ value }}
-
+
@@ -122,7 +122,7 @@
import { Input } from '@/components/ui/input'
import { Icon } from '#components'
-import { AppCard, AppModal } from '@/components/app'
+import { AppModal } from '@/components/app'
import { Badge } from '@/components/ui/badge'
import { Button } from '@/components/ui/button'
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from '@/components/ui/command'
@@ -298,4 +298,4 @@ const togglePolicy = (value: string) => {
editForm.policies = [...editForm.policies, value]
}
}
-
\ No newline at end of file
+
diff --git a/components/users/user/notice.vue b/components/users/user/notice.vue
index 374ea11..1666396 100644
--- a/components/users/user/notice.vue
+++ b/components/users/user/notice.vue
@@ -1,6 +1,6 @@
-
+
@@ -9,7 +9,7 @@
-
+
@@ -23,7 +23,7 @@
\ No newline at end of file
+
diff --git a/components/users/user/policies.vue b/components/users/user/policies.vue
index 0755acf..a585417 100644
--- a/components/users/user/policies.vue
+++ b/components/users/user/policies.vue
@@ -1,5 +1,5 @@
-
+
@@ -84,14 +84,13 @@
-
+
\ No newline at end of file
+
diff --git a/docs/shadcn-migration-plan.md b/docs/shadcn-migration-plan.md
index d7becca..e07c9b3 100644
--- a/docs/shadcn-migration-plan.md
+++ b/docs/shadcn-migration-plan.md
@@ -24,7 +24,7 @@ Each phase will be committed independently on `refactor/shadcn-vue` to keep roll
| Buttons | `NButton`, `NButtonGroup` | Use shadcn `Button` / `ButtonGroup` directly; add Tailwind utilities or inline spinner when needed for loading states. |
| Feedback | `NModal`, `NDrawer`, `NAlert`, `NTooltip`, `NEmpty`, `NProgress`, `NSpin`, `NStatistic`, `NBreadcrumb` | Use shadcn `Dialog`, `Drawer`, `Alert`, `Tooltip`, `Empty` block, `Progress`, `Spinner` etc. Create `app-stat`/`app-empty` wrappers where gaps exist. |
| Data display | `NCard`, `NList`, `NThing`, `NBadge`, `NTag`, `NDescriptions`, `NDescriptionsItem`, `NCarousel`, `NCollapse`, `NCollapseItem` | Replace with shadcn `Card`, `Badge`, `Accordion`, `Tabs` etc. Implement `AppDescriptionList` (simple definition list) and `AppTag` (using `Badge` or `Chip`). Use `Carousel` block already present. |
-| Tables | `NDataTable`, `NVirtualList` | Implement `AppDataTable` powered by `@tanstack/vue-table` + `ScrollArea`. Support selection, inline actions, slot-based cell rendering. Provide compatible props for datasets currently using render functions. |
+| Tables | `NDataTable`, `NVirtualList` | Implement `DataTable` powered by `@tanstack/vue-table` + `ScrollArea`. Support selection, inline actions, slot-based cell rendering. Provide compatible props for datasets currently using render functions. |
| Misc | `NDrawerContent`, `NScrollbar`, `NPageHeader`, `NPopover`, `NPopconfirm` | Use `DrawerContent`, `ScrollArea`, `PageHeader` replaced by `div` + `Breadcrumb`, shadcn `Popover`, and build `AppConfirmDialog` on top of AlertDialog. |
### Additional Dependencies
@@ -36,17 +36,17 @@ Each phase will be committed independently on `refactor/shadcn-vue` to keep roll
- `components/app/AppUiProvider.vue` – wraps shadcn theme providers and exports composables for toasts/dialogs.
- `components/app/AppSidebar.vue` + related items (menu, user dropdown host) following Sidebar07 markup.
-- `components/app/AppCard.vue`, `AppBadge.vue`, `AppTag.vue` (buttons now import `Button` directly).
+- `components/app/AppCard.vue`, `AppTag.vue` (buttons now import `Button` directly).
- `components/app/AppForm.vue`, `AppFormField.vue`, `AppFieldGrid.vue` for consistent form layout.
- `components/app/AppDialog.vue`, `AppDrawer.vue`, `AppConfirmDialog.vue`.
-- `components/app/AppDataTable` module with column definitions, toolbar templates, and selection helpers.
+- `components/DataTable` module with column definitions, toolbar templates, and selection helpers.
- `components/app/AppDescriptionList.vue`, `AppEmpty.vue`, `AppStatistic.vue`, `AppSpinner.vue`.
These wrappers allow feature screens to migrate with minimal churn and keep visual consistency.
## Page Migration Order
-1. **Access Keys / Users / Policies** – heavy data table usage; verify AppDataTable handles selection and actions.
+1. **Access Keys / Users / Policies** – heavy data table usage; verify DataTable handles selection and actions.
2. **Objects & Buckets** – exercise drawers/modals, dynamic input, and descriptions.
3. **Lifecycle / Replication / Events** – validate complex forms, tabs, accordions.
4. **Performance Dashboard** – ensure stats, badges, carousel translations remain coherent.
diff --git a/docs/shadcn-migration-todo.md b/docs/shadcn-migration-todo.md
index f472683..3a5c126 100644
--- a/docs/shadcn-migration-todo.md
+++ b/docs/shadcn-migration-todo.md
@@ -4,8 +4,8 @@
- [x] Build `components/app/AppSidebar.vue` and supporting subcomponents to render navigation, language/theme controls, and user menu with ShadCN UI widgets.
- [x] Replace Naive UI providers in `app.vue` with ShadCN-friendly structure, wiring toast/dialog replacements and preserving color mode handling.
- [x] Convert shared form components and high-use Naive UI elements (buttons, inputs, tables, etc.) to their ShadCN equivalents, introducing reusable wrappers under `components/app-` when helpful.
- - [x] Establish shared wrappers (`AppCard`, `AppSelect`, `AppSwitch`, etc.) under `components/app`; buttons/inputs now import shadcn primitives directly.
- - [x] Build reusable data table primitives (`AppDataTable`, pagination, `useDataTable`) powered by TanStack.
+ - [x] Establish shared wrappers (`AppCard`, `AppSelect`, etc.) under `components/app`; buttons/inputs now import shadcn primitives directly.
+ - [x] Build reusable data table primitives (`DataTable`, pagination, `useDataTable`) powered by TanStack.
- [x] Convert `components/copy-input.vue` to the new wrappers and toast API.
- [x] Rebuild the users list tab (`components/users/tabs/user.vue`) with ShadCN table, checkbox, dialog, and button primitives.
- [x] Rebuild the user groups tab (`components/users/tabs/group.vue`) with ShadCN input, table, checkbox, and dialog primitives.
diff --git a/layouts/default.vue b/layouts/default.vue
index 9a503af..f492ab5 100644
--- a/layouts/default.vue
+++ b/layouts/default.vue
@@ -1,9 +1,8 @@
diff --git a/pages/browser/index.vue b/pages/browser/index.vue
index cca53c6..ddcd1d0 100644
--- a/pages/browser/index.vue
+++ b/pages/browser/index.vue
@@ -1,16 +1,13 @@
-
-
\ No newline at end of file
+
+
diff --git a/pages/events-target/index.vue b/pages/events-target/index.vue
index bbcfbe2..42b702d 100644
--- a/pages/events-target/index.vue
+++ b/pages/events-target/index.vue
@@ -1,16 +1,10 @@
-
+
{{ t('Event Destinations') }}
-
-
-
-
+
@@ -25,33 +19,26 @@
{{ t('Refresh') }}
-
+
+
-
-
-
-
+ refresh()" />
-
+
\ No newline at end of file
+
diff --git a/pages/events/index.vue b/pages/events/index.vue
index 15c4cf7..0a5d976 100644
--- a/pages/events/index.vue
+++ b/pages/events/index.vue
@@ -1,48 +1,37 @@
-
+
\ No newline at end of file
+
diff --git a/pages/lifecycle/index.vue b/pages/lifecycle/index.vue
index d3547e2..8fc41d6 100644
--- a/pages/lifecycle/index.vue
+++ b/pages/lifecycle/index.vue
@@ -1,62 +1,42 @@
-