diff --git a/components/base/DropdownContentRender.vue b/components/base/DropdownContentRender.vue
new file mode 100644
index 0000000..264715e
--- /dev/null
+++ b/components/base/DropdownContentRender.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+ {{ item.label }}
+ {{ item.kbd }}
+
+
+
+
+
+
+
+
+ {{ item.label }}
+ {{ item.kbd }}
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+ {{ (option as any)?.label || option }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/base/DropdownMenu.vue b/components/base/DropdownMenu.vue
new file mode 100644
index 0000000..dd1e813
--- /dev/null
+++ b/components/base/DropdownMenu.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/base/Tree.vue b/components/base/Tree.vue
index df75f43..0829c69 100644
--- a/components/base/Tree.vue
+++ b/components/base/Tree.vue
@@ -1,5 +1,5 @@
-
+
@@ -19,9 +19,15 @@ interface TreeItem
label: string
link?: string
tag?: string
+ open?: boolean
children?: TreeItem[]
}
const model = defineModel();
+
+function flatten(arr: TreeItem[]): string[]
+{
+ return arr.filter(e => e.open).flatMap(e => [e?.link ?? e.label, ...flatten(e.children ?? [])]);
+}