From 80bf8b038e30f2069379fb785c34c3f0e9735e84 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Mon, 29 Dec 2025 18:11:49 +0800 Subject: [PATCH 01/14] =?UTF-8?q?fix(=E8=8F=9C=E5=8D=95):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E8=8F=9C=E5=8D=95=E5=AE=BD=E5=BA=A6=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.vue | 61 +++++++++++++------------- src/ui/markdown/ShadcnMarkdown.vue | 64 +++++++++++++++++++++++++-- src/ui/menu/ShadcnMenuItem.vue | 10 ++--- src/ui/menu/ShadcnMenuSub.vue | 69 +++++++++++++++++++++++++----- 4 files changed, 155 insertions(+), 49 deletions(-) diff --git a/src/App.vue b/src/App.vue index 699dc126..ceeca004 100644 --- a/src/App.vue +++ b/src/App.vue @@ -6,49 +6,52 @@
-

ShadcnTable - 液态玻璃效果

+

ShadcnMarkdown - 液态玻璃效果

- +
+ + + + + Home + + + + + + + Change + Change Password + + + Change Email + + + Logout + + diff --git a/src/ui/markdown/ShadcnMarkdown.vue b/src/ui/markdown/ShadcnMarkdown.vue index 2feb76b0..7c28d526 100644 --- a/src/ui/markdown/ShadcnMarkdown.vue +++ b/src/ui/markdown/ShadcnMarkdown.vue @@ -6,8 +6,8 @@ props.glass && 'shadow-lg shadow-black/5', !props.glass && (props.dark ? 'bg-gray-800 border border-gray-700' : 'bg-white border border-gray-200') ]"> -
-
+
+
编辑
@@ -21,7 +21,26 @@ ]" @input="handleInput"/>
-
+ + +
+
+
+ +
预览
@@ -53,7 +72,7 @@ diff --git a/src/ui/menu/ShadcnMenuItem.vue b/src/ui/menu/ShadcnMenuItem.vue index 07f88d99..a2f3c049 100644 --- a/src/ui/menu/ShadcnMenuItem.vue +++ b/src/ui/menu/ShadcnMenuItem.vue @@ -1,11 +1,10 @@ +``` + +::: + ## 服务 ($Spin) ::: raw @@ -188,6 +224,8 @@ export default { ['type', '组件的类型', 'enum', 'primary', 'primary | success | warning | error'], ['size', '组件的尺寸', 'enum', 'default', 'default | small | large'], ['fixed', '是否固定在父组件上,父组件必须使用 position: relative', 'boolean', 'false', '-'], + ['glass', '是否启用液态玻璃效果', 'boolean', 'false', '-'], + ['dark', '是否启用暗黑模式', 'boolean', 'false', '-'], ]"> diff --git a/playground/src/example/spin/glass.vue b/playground/src/example/spin/glass.vue new file mode 100644 index 00000000..a9a6f8a3 --- /dev/null +++ b/playground/src/example/spin/glass.vue @@ -0,0 +1,42 @@ + + + diff --git a/playground/src/example/spin/usage.vue b/playground/src/example/spin/usage.vue new file mode 100644 index 00000000..88d2df7c --- /dev/null +++ b/playground/src/example/spin/usage.vue @@ -0,0 +1,8 @@ + + + diff --git a/src/App.vue b/src/App.vue index 029c489d..8b896c9d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -4,10 +4,16 @@ 切换暗黑模式 -
- - Hover - +
+

Spin 液态玻璃效果

+
+
+ + + {{ loading ? '停止加载' : '开始加载' }} + +
+
@@ -16,6 +22,8 @@ diff --git a/src/ui/spin/ShadcnSpin.vue b/src/ui/spin/ShadcnSpin.vue index af1eacf4..71618cb8 100644 --- a/src/ui/spin/ShadcnSpin.vue +++ b/src/ui/spin/ShadcnSpin.vue @@ -6,7 +6,11 @@ fixed ? 'absolute inset-0' : 'relative' ]"> -
+
@@ -15,7 +19,8 @@
@@ -36,12 +41,14 @@ const props = withDefaults(defineProps<{ size?: keyof typeof WrapperSize fixed?: boolean dark?: boolean + glass?: boolean }>(), { modelValue: true, type: 'primary', size: 'default', fixed: false, - dark: false + dark: false, + glass: false }) watch(() => props.modelValue, (newValue) => { From fb656e72840d0c762ca91583e9be0752b01ba678 Mon Sep 17 00:00:00 2001 From: qianmoQ Date: Tue, 30 Dec 2025 15:59:31 +0800 Subject: [PATCH 06/14] =?UTF-8?q?feat(=E7=BB=84=E4=BB=B6):=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20Dropdown=20=E6=B6=B2=E6=80=81=E7=8E=BB=E7=92=83?= =?UTF-8?q?=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/components/navigation/dropdown.md | 74 +++++++++++++++++++++++ playground/src/example/dropdown/glass.vue | 60 ++++++++++++++++++ playground/src/example/dropdown/usage.vue | 25 ++++++++ src/App.vue | 20 +++--- src/ui/dropdown/ShadcnDropdown.vue | 8 ++- src/ui/dropdown/ShadcnDropdownItem.vue | 17 ++++-- src/ui/dropdown/types.ts | 1 + 7 files changed, 191 insertions(+), 14 deletions(-) create mode 100644 playground/src/example/dropdown/glass.vue create mode 100644 playground/src/example/dropdown/usage.vue diff --git a/docs/components/navigation/dropdown.md b/docs/components/navigation/dropdown.md index 4ec99eb2..e28c9838 100644 --- a/docs/components/navigation/dropdown.md +++ b/docs/components/navigation/dropdown.md @@ -186,6 +186,78 @@ title: 下拉菜单 (Dropdown) ::: +## 液态玻璃效果 (glass) + +::: raw + + +
+
+ + + 操作 1 + 操作 2 + 操作 3 + 操作 4 + + + + + 操作 1 + 操作 2 + 操作 3 + 操作 4 (禁用) + +
+
+
+ +::: + +::: details 查看代码 + +```vue + + + +``` + +::: + ## 下拉菜单 (Dropdown) 属性 diff --git a/playground/src/example/dropdown/glass.vue b/playground/src/example/dropdown/glass.vue new file mode 100644 index 00000000..80d437ba --- /dev/null +++ b/playground/src/example/dropdown/glass.vue @@ -0,0 +1,60 @@ + + + diff --git a/playground/src/example/dropdown/usage.vue b/playground/src/example/dropdown/usage.vue new file mode 100644 index 00000000..106ad28c --- /dev/null +++ b/playground/src/example/dropdown/usage.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/App.vue b/src/App.vue index 8b896c9d..9b3f8f59 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,13 +5,18 @@
-

Spin 液态玻璃效果

+

Dropdown 液态玻璃效果

-
- - - {{ loading ? '停止加载' : '开始加载' }} - +
+ + + 操作 1 + 操作 2 + 操作 3 + 操作 4 +
@@ -22,8 +27,7 @@ diff --git a/src/ui/dropdown/ShadcnDropdown.vue b/src/ui/dropdown/ShadcnDropdown.vue index d0806233..953f4412 100644 --- a/src/ui/dropdown/ShadcnDropdown.vue +++ b/src/ui/dropdown/ShadcnDropdown.vue @@ -23,7 +23,9 @@ @mouseenter="trigger === 'hover' && onMenuMouseEnter()" @mouseleave="trigger === 'hover' && onMenuMouseLeave()" :class="['fixed z-50 min-w-[8rem] rounded-md shadow-lg ring-1 focus:outline-none', - dark ? 'bg-gray-700 ring-gray-600' : 'bg-white ring-black ring-opacity-5', + glass && 'backdrop-blur-xl backdrop-saturate-150', + glass && (dark ? 'bg-white/10 ring-white/20' : 'bg-white/30 ring-gray-400/40'), + !glass && (dark ? 'bg-gray-700 ring-gray-600' : 'bg-white ring-black ring-opacity-5'), positionClasses ]" :style="dropdownStyle"> @@ -49,7 +51,8 @@ const emit = defineEmits() const props = withDefaults(defineProps(), { trigger: 'click', position: ArrangePosition.left, - dark: false + dark: false, + glass: false }) const isOpen = ref(false) @@ -166,6 +169,7 @@ const onClickOutside = (event: MouseEvent) => { provide('closeDropdown', onClose) provide('dropdownDark', toRef(props, 'dark')) +provide('dropdownGlass', toRef(props, 'glass')) onMounted(() => { document.addEventListener('click', onClickOutside) diff --git a/src/ui/dropdown/ShadcnDropdownItem.vue b/src/ui/dropdown/ShadcnDropdownItem.vue index d9a68034..eaef9c40 100644 --- a/src/ui/dropdown/ShadcnDropdownItem.vue +++ b/src/ui/dropdown/ShadcnDropdownItem.vue @@ -1,12 +1,19 @@