@a-drowned-fish/rox-v 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +149 -201
  2. package/dist/es/collapse/collapse.js +1 -1
  3. package/dist/es/collapse/collapse.vue_vue_type_script_setup_true_lang.js +1 -0
  4. package/dist/es/collapse/style.css +1 -1
  5. package/dist/es/components.js +4 -2
  6. package/dist/es/index.js +6 -5
  7. package/dist/es/input/input.js +1 -1
  8. package/dist/es/input/input.vue_vue_type_script_setup_true_lang.js +1 -0
  9. package/dist/es/input/style.css +1 -1
  10. package/dist/es/menu/index.js +7 -0
  11. package/dist/es/menu/menu-item.js +5 -0
  12. package/dist/es/menu/menu-item.vue_vue_type_script_setup_true_lang.js +97 -0
  13. package/dist/es/menu/menu.js +7 -0
  14. package/dist/es/menu/menu.vue_vue_type_script_setup_true_lang.js +82 -0
  15. package/dist/es/menu/style.css +1 -0
  16. package/dist/es/menu/style.css.js +0 -0
  17. package/dist/index.js +1 -1
  18. package/dist/lib/collapse/collapse.js +1 -1
  19. package/dist/lib/collapse/collapse.vue_vue_type_script_setup_true_lang.js +1 -1
  20. package/dist/lib/collapse/style.css +1 -1
  21. package/dist/lib/components.js +1 -1
  22. package/dist/lib/index.js +1 -1
  23. package/dist/lib/input/input.js +1 -1
  24. package/dist/lib/input/input.vue_vue_type_script_setup_true_lang.js +1 -1
  25. package/dist/lib/input/style.css +1 -1
  26. package/dist/lib/menu/index.js +1 -0
  27. package/dist/lib/menu/menu-item.js +1 -0
  28. package/dist/lib/menu/menu-item.vue_vue_type_script_setup_true_lang.js +1 -0
  29. package/dist/lib/menu/menu.js +1 -0
  30. package/dist/lib/menu/menu.vue_vue_type_script_setup_true_lang.js +1 -0
  31. package/dist/lib/menu/style.css +1 -0
  32. package/dist/lib/menu/style.css.js +0 -0
  33. package/dist/style.css +1 -1
  34. package/dist/types/components/components.d.ts +2 -0
  35. package/dist/types/components/menu/index.d.ts +5 -0
  36. package/dist/types/components/menu/menu-item.vue.d.ts +17 -0
  37. package/dist/types/components/menu/menu.vue.d.ts +39 -0
  38. package/dist/types/components/menu/style.css.d.ts +1 -0
  39. package/dist/types/components/menu/types.d.ts +19 -0
  40. package/package.json +1 -1
package/README.md CHANGED
@@ -1,279 +1,227 @@
1
- # Rox V
2
-
3
- 一个基于 Vue 3 的组件库,支持按需引入和自动导入。
4
-
5
- ## 安装
6
-
7
- ```bash
8
- npm install @a-drowned-fish/rox-v
9
- # 或
10
- yarn add @a-drowned-fish/rox-v
11
- # 或
12
- pnpm add @a-drowned-fish/rox-v
13
- ```
14
-
15
- ## 使用方式
16
-
17
- ### 1. 完整引入
18
-
19
- ```ts
20
- import { createApp } from "vue";
21
- import RoxV from "@a-drowned-fish/rox-v";
22
- import "@a-drowned-fish/rox-v/dist/style.css"; // 如果需要样式
23
-
24
- const app = createApp(App);
25
- app.use(RoxV);
26
- ```
27
-
28
- ### 2. 按需引入(推荐)
29
-
30
- - 优势: 无需手动引入样式文件 且 按需加载
1
+ |
31
2
 
32
- ```vue
33
- <template>
34
- <Button>点击我</Button>
35
- <InputOtp />
36
- </template>
37
- <script setup lang="ts">
38
- import { Button, InputOtp } from "@a-drowned-fish/rox-v";
39
- </script>
40
- ```
3
+ #### Slots
41
4
 
42
- ## 可用组件
5
+ | 插槽名 | 说明 |
6
+ | ------- | ------------ |
7
+ | default | 弹窗内容区域 |
43
8
 
44
- ### InputOtp - OTP 输入组件
9
+ ### Menu - 下拉菜单组件
45
10
 
46
- 一个用于输入一次性密码(OTP)的组件,支持自定义长度、样式和间距。
11
+ 一个支持多级嵌套的下拉菜单组件,支持点击和悬停触发方式,带有过渡动画效果。
47
12
 
48
13
  #### 基础用法
49
14
 
50
15
  ```vue
51
16
  <template>
52
- <InputOtp v-model="code" />
17
+ <Menu :items="menuItems" v-model="selectedValue">
18
+ <span>点击打开菜单</span>
19
+ </Menu>
53
20
  </template>
54
21
 
55
22
  <script setup lang="ts">
56
23
  import { ref } from "vue";
24
+ import { Menu } from "@a-drowned-fish/rox-v";
57
25
 
58
- const code = ref("");
26
+ const selectedValue = ref<(string | number)[]>([]);
27
+
28
+ const menuItems = [
29
+ { label: "选项1", value: "option1" },
30
+ { label: "选项2", value: "option2" },
31
+ { label: "选项3", value: "option3" },
32
+ ];
59
33
  </script>
60
34
  ```
61
35
 
62
- #### 自定义长度
36
+ #### 多级菜单
63
37
 
64
38
  ```vue
65
39
  <template>
66
- <!-- 4位验证码 -->
67
- <InputOtp v-model="code" :length="4" />
68
-
69
- <!-- 8位验证码 -->
70
- <InputOtp v-model="code" :length="8" />
40
+ <Menu :items="menuItems" v-model="selectedValue">
41
+ <span>多级菜单</span>
42
+ </Menu>
71
43
  </template>
72
44
 
73
45
  <script setup lang="ts">
74
46
  import { ref } from "vue";
75
-
76
- const code = ref("");
47
+ import { Menu } from "@a-drowned-fish/rox-v";
48
+
49
+ const selectedValue = ref<(string | number)[]>([]);
50
+
51
+ const menuItems = [
52
+ {
53
+ label: "文件",
54
+ value: "file",
55
+ children: [
56
+ { label: "新建", value: "new" },
57
+ { label: "打开", value: "open" },
58
+ { label: "保存", value: "save" },
59
+ ],
60
+ },
61
+ {
62
+ label: "编辑",
63
+ value: "edit",
64
+ children: [
65
+ { label: "撤销", value: "undo" },
66
+ { label: "重做", value: "redo" },
67
+ {
68
+ label: "查找",
69
+ value: "find",
70
+ children: [
71
+ { label: "查找文本", value: "find-text" },
72
+ { label: "替换", value: "replace" },
73
+ ],
74
+ },
75
+ ],
76
+ },
77
+ ];
77
78
  </script>
78
79
  ```
79
80
 
80
- #### 自定义样式
81
+ #### 自定义图标
81
82
 
82
83
  ```vue
83
84
  <template>
84
- <InputOtp v-model="code" item-class="custom-item" active-item-class="custom-active" gap="15px" />
85
+ <Menu :items="menuItems" suffix-icon="/icons/arrow-right.svg" checked-icon="/icons/check.svg" v-model="selectedValue">
86
+ <span>带图标的菜单</span>
87
+ </Menu>
85
88
  </template>
86
89
 
87
90
  <script setup lang="ts">
88
91
  import { ref } from "vue";
89
-
90
- const code = ref("");
92
+ import { Menu } from "@a-drowned-fish/rox-v";
93
+
94
+ const selectedValue = ref<(string | number)[]>([]);
95
+
96
+ const menuItems = [
97
+ { label: "选项1", value: "option1" },
98
+ { label: "选项2", value: "option2" },
99
+ {
100
+ label: "子菜单",
101
+ value: "submenu",
102
+ children: [{ label: "子选项", value: "sub-option" }],
103
+ },
104
+ ];
91
105
  </script>
92
-
93
- <style scoped>
94
- .custom-item {
95
- width: 50px;
96
- height: 60px;
97
- border: 2px solid #ddd;
98
- border-radius: 12px;
99
- font-size: 24px;
100
- }
101
-
102
- .custom-active {
103
- border-color: #67c23a;
104
- box-shadow: 0 0 0 3px rgba(103, 194, 58, 0.2);
105
- }
106
- </style>
107
106
  ```
108
107
 
109
- #### 监听完成事件
108
+ #### 监听事件
110
109
 
111
110
  ```vue
112
111
  <template>
113
- <InputOtp v-model="code" @complete="handleComplete" />
112
+ <Menu :items="menuItems" v-model="selectedValue" @open="handleOpen" @close="handleClose">
113
+ <span>监听事件</span>
114
+ </Menu>
114
115
  </template>
115
116
 
116
117
  <script setup lang="ts">
117
118
  import { ref } from "vue";
119
+ import { Menu } from "@a-drowned-fish/rox-v";
118
120
 
119
- const code = ref("");
121
+ const selectedValue = ref<(string | number)[]>([]);
120
122
 
121
- const handleComplete = (value: string) => {
122
- console.log("验证码输入完成:", value);
123
- // 在这里执行验证逻辑
123
+ const menuItems = [
124
+ { label: "选项1", value: "option1" },
125
+ { label: "选项2", value: "option2" },
126
+ ];
127
+
128
+ const handleOpen = () => {
129
+ console.log("菜单已打开");
130
+ };
131
+
132
+ const handleClose = () => {
133
+ console.log("菜单已关闭");
124
134
  };
125
135
  </script>
126
136
  ```
127
137
 
128
- #### Props
129
-
130
- | 属性 | 说明 | 类型 | 默认值 |
131
- | ------------------ | -------------------------------------------- | -------- | ---------- |
132
- | length | 输入框数量 | `number` | `6` |
133
- | itemClass | 每个输入项的自定义类名 | `string` | `''` |
134
- | activeItemClass | 激活状态输入项的自定义类名 | `string` | `''` |
135
- | gap | 输入项之间的间距 | `string` | `'10px'` |
136
- | hasFilledItemClass | 具有内容的输入项的类名[active前面选项的类名] | `string` | `'active'` |
137
-
138
- #### Events
139
-
140
- | 事件名 | 说明 | 回调参数 |
141
- | -------- | ------------------------------ | ----------------- |
142
- | complete | 输入完成时触发(达到指定长度) | `(value: string)` |
143
-
144
- ### Popup - 弹出层组件
145
-
146
- 一个灵活的弹出层组件,支持从不同方向滑入,带有遮罩层和过渡动画效果。
147
-
148
- #### 基础用法
138
+ #### 自定义样式
149
139
 
150
140
  ```vue
151
141
  <template>
152
- <Button @click="show = true">打开弹窗</Button>
153
-
154
- <Popup v-model="show">
155
- <div class="popup-content">
156
- <h3>标题</h3>
157
- <p>这是弹窗内容</p>
158
- <Button @click="show = false">关闭</Button>
159
- </div>
160
- </Popup>
142
+ <Menu
143
+ :items="menuItems"
144
+ v-model="selectedValue"
145
+ item-gap="8px"
146
+ active-item-class="custom-active"
147
+ list-container-class="custom-list"
148
+ default-container-class="custom-trigger"
149
+ >
150
+ <span>自定义样式</span>
151
+ </Menu>
161
152
  </template>
162
153
 
163
154
  <script setup lang="ts">
164
155
  import { ref } from "vue";
165
- import { Button, Popup } from "@a-drowned-fish/rox-v";
156
+ import { Menu } from "@a-drowned-fish/rox-v";
157
+
158
+ const selectedValue = ref<(string | number)[]>([]);
166
159
 
167
- const show = ref(false);
160
+ const menuItems = [
161
+ { label: "选项1", value: "option1" },
162
+ { label: "选项2", value: "option2" },
163
+ ];
168
164
  </script>
169
165
 
170
166
  <style scoped>
171
- .popup-content {
172
- padding: 20px;
173
- background: white;
174
- border-radius: 12px 12px 0 0;
167
+ .custom-trigger {
168
+ background-color: #409eff;
169
+ color: white;
170
+ border-radius: 4px;
175
171
  }
176
- </style>
177
- ```
178
-
179
- #### 不同位置
180
172
 
181
- ```vue
182
- <template>
183
- <!-- 底部弹出(默认) -->
184
- <Popup v-model="showBottom" position="bottom">
185
- <div class="content">底部弹窗</div>
186
- </Popup>
187
-
188
- <!-- 顶部弹出 -->
189
- <Popup v-model="showTop" position="top">
190
- <div class="content">顶部弹窗</div>
191
- </Popup>
192
-
193
- <!-- 左侧弹出 -->
194
- <Popup v-model="showLeft" position="left">
195
- <div class="content">左侧弹窗</div>
196
- </Popup>
197
-
198
- <!-- 右侧弹出 -->
199
- <Popup v-model="showRight" position="right">
200
- <div class="content">右侧弹窗</div>
201
- </Popup>
202
- </template>
203
-
204
- <script setup lang="ts">
205
- import { ref } from "vue";
206
- import { Popup } from "@a-drowned-fish/rox-v";
173
+ .custom-list {
174
+ border-radius: 8px;
175
+ }
207
176
 
208
- const showBottom = ref(false);
209
- const showTop = ref(false);
210
- const showLeft = ref(false);
211
- const showRight = ref(false);
212
- </script>
177
+ .custom-active {
178
+ background-color: #ecf5ff;
179
+ color: #409eff;
180
+ }
181
+ </style>
213
182
  ```
214
183
 
215
- #### 自定义遮罩层
184
+ #### Props
216
185
 
217
- ```vue
218
- <template>
219
- <Popup v-model="show" :bg="'rgba(0, 0, 0, 0.7)'" :duration="500" :mask-closable="false">
220
- <div class="content">
221
- <p>点击遮罩层不会关闭</p>
222
- <Button @click="show = false">手动关闭</Button>
223
- </div>
224
- </Popup>
225
- </template>
186
+ | 属性 | 说明 | 类型 | 默认值 |
187
+ | --------------------- | ------------------------ | ----------------------- | ------- |
188
+ | items | 菜单项数据 | `RoxVMenuOptionProps[]` | `[]` |
189
+ | duration | 过渡动画持续时间(毫秒) | `number` | `100` |
190
+ | suffixIcon | 子菜单后缀图标 URL | `string` | `''` |
191
+ | suffixIconClass | 后缀图标的自定义类名 | `string` | `''` |
192
+ | checkedIcon | 选中项的图标 URL | `string` | `''` |
193
+ | checkedIconClass | 选中标记图标的自定义类名 | `string` | `''` |
194
+ | listContainerClass | 菜单列表容器的自定义类名 | `string` | `''` |
195
+ | subMenuContainerClass | 子菜单容器的自定义类名 | `string` | `''` |
196
+ | defaultContainerClass | 触发区域容器的自定义类名 | `string` | `''` |
197
+ | itemContainerClass | 菜单项的自定义类名 | `string` | `''` |
198
+ | itemGap | 菜单项之间的间距 | `string` | `'4px'` |
199
+ | activeItemClass | 激活菜单项的自定义类名 | `string` | `''` |
200
+ | v-model | 当前选中的菜单项路径 | `(string \| number)[]` | `[]` |
226
201
 
227
- <script setup lang="ts">
228
- import { ref } from "vue";
229
- import { Popup, Button } from "@a-drowned-fish/rox-v";
202
+ #### Events
230
203
 
231
- const show = ref(false);
232
- </script>
233
- ```
204
+ | 事件名 | 说明 | 回调参数 |
205
+ | ------ | ---------- | -------- |
206
+ | open | 菜单打开时 | 无 |
207
+ | close | 菜单关闭时 | 无 |
234
208
 
235
- #### 自定义挂载节点
209
+ #### Slots
236
210
 
237
- ```vue
238
- <template>
239
- <div id="custom-container">
240
- <Popup v-model="show" to="#custom-container">
241
- <div class="content">挂载到指定容器</div>
242
- </Popup>
243
- </div>
244
- </template>
211
+ | 插槽名 | 说明 |
212
+ | ------- | -------------------- |
213
+ | default | 触发区域的自定义内容 |
245
214
 
246
- <script setup lang="ts">
247
- import { ref } from "vue";
248
- import { Popup } from "@a-drowned-fish/rox-v";
215
+ #### 类型定义
249
216
 
250
- const show = ref(false);
251
- </script>
217
+ ```ts
218
+ interface RoxVMenuOptionProps {
219
+ label: string; // 菜单项显示文本
220
+ value: string | number; // 菜单项唯一标识
221
+ children?: RoxVMenuOptionProps[]; // 子菜单项(可选)
222
+ }
252
223
  ```
253
224
 
254
- #### Props
255
-
256
- | 属性 | 说明 | 类型 | 默认值 |
257
- | ------------ | ---------------------------- | ---------------------------------------- | --------------------- |
258
- | position | 弹出位置 | `'top' \| 'bottom' \| 'left' \| 'right'` | `'bottom'` |
259
- | bg | 遮罩层背景色 | `string` | `'rgba(0, 0, 0, .5)'` |
260
- | duration | 动画持续时间(毫秒) | `number` | `300` |
261
- | maskClosable | 点击遮罩层是否关闭 | `boolean` | `true` |
262
- | to | teleport 的目标节点 | `string` | `'body'` |
263
- | top | 弹窗顶部距离父元素顶部的距离 | `string` | `'0px'` |
264
- | left | 弹窗左侧距离父元素左侧的距离 | `string` | `'0px'` |
265
- | right | 弹窗右侧距离父元素右侧的距离 | `string` | `'0px'` |
266
- | bottom | 弹窗底部距离父元素底部的距离 | `string` | `'0px'` |
267
- | zIndex | 弹窗的 z-index 值 | `number` | `50` |
268
-
269
- |
270
-
271
- #### Slots
272
-
273
- | 插槽名 | 说明 |
274
- | ------- | ------------ |
275
- | default | 弹窗内容区域 |
276
-
277
225
  ## License
278
226
 
279
227
  MIT
@@ -2,6 +2,6 @@ import e from "../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./collapse.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region components/collapse/collapse.vue
5
- var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-cea8a740"]]);
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-cc071022"]]);
6
6
  //#endregion
7
7
  export { n as default };
@@ -1,6 +1,7 @@
1
1
  import { Transition as e, createBlock as t, createCommentVNode as n, createElementBlock as r, defineComponent as i, normalizeStyle as a, openBlock as o, renderSlot as s, withCtx as c } from "vue";
2
2
  //#region components/collapse/collapse.vue?vue&type=script&setup=true&lang.ts
3
3
  var l = /* @__PURE__ */ i({
4
+ name: "Collapse",
4
5
  __name: "collapse",
5
6
  props: {
6
7
  open: {
@@ -1 +1 @@
1
- .collapse-content[data-v-cea8a740]{width:max-content}.collapse-enter-from[data-v-cea8a740],.collapse-leave-to[data-v-cea8a740]{max-height:0!important}.collapse-enter-active[data-v-cea8a740],.collapse-leave-active[data-v-cea8a740]{max-height:var(--max-height);transition:max-height var(--duration) ease-in-out;overflow:hidden}
1
+ .collapse-content[data-v-cc071022]{width:max-content}.collapse-enter-from[data-v-cc071022],.collapse-leave-to[data-v-cc071022]{max-height:0!important}.collapse-enter-active[data-v-cc071022],.collapse-leave-active[data-v-cc071022]{max-height:var(--max-height);transition:max-height var(--duration) ease-in-out;overflow:hidden}
@@ -4,13 +4,15 @@ import n from "./popup/index.js";
4
4
  import r from "./button/index.js";
5
5
  import i from "./collapse/index.js";
6
6
  import a from "./input/index.js";
7
+ import o from "./menu/index.js";
7
8
  //#region components/components.ts
8
- var o = /* @__PURE__ */ e({
9
+ var s = /* @__PURE__ */ e({
9
10
  Button: () => r,
10
11
  Collapse: () => i,
11
12
  Input: () => a,
12
13
  InputOtp: () => t,
14
+ Menu: () => o,
13
15
  Popup: () => n
14
16
  });
15
17
  //#endregion
16
- export { o as components_exports };
18
+ export { s as components_exports };
package/dist/es/index.js CHANGED
@@ -3,12 +3,13 @@ import t from "./popup/index.js";
3
3
  import n from "./button/index.js";
4
4
  import r from "./collapse/index.js";
5
5
  import i from "./input/index.js";
6
- import { components_exports as a } from "./components.js";
6
+ import a from "./menu/index.js";
7
+ import { components_exports as o } from "./components.js";
7
8
  /* empty css */
8
9
  //#region components/index.ts
9
- var o = (e) => (Object.keys(a).forEach((t) => {
10
- let n = a[t];
10
+ var s = (e) => (Object.keys(o).forEach((t) => {
11
+ let n = o[t];
11
12
  n.install && e.use(n);
12
- }), e), s = { install: o };
13
+ }), e), c = { install: s };
13
14
  //#endregion
14
- export { n as Button, r as Collapse, i as Input, e as InputOtp, t as Popup, s as default, o as install };
15
+ export { n as Button, r as Collapse, i as Input, e as InputOtp, a as Menu, t as Popup, c as default, s as install };
@@ -2,6 +2,6 @@ import e from "../_virtual/_plugin-vue_export-helper.js";
2
2
  import t from "./input.vue_vue_type_script_setup_true_lang.js";
3
3
  /* empty css */
4
4
  //#region components/input/input.vue
5
- var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-f5f052a7"]]);
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-56cf72b9"]]);
6
6
  //#endregion
7
7
  export { n as default };
@@ -1,6 +1,7 @@
1
1
  import { createCommentVNode as e, createElementBlock as t, createElementVNode as n, defineComponent as r, mergeModels as i, openBlock as a, useModel as o, useTemplateRef as s, vModelDynamic as c, vShow as l, withDirectives as u, withKeys as d } from "vue";
2
2
  //#region components/input/input.vue?vue&type=script&setup=true&lang.ts
3
3
  var f = { class: "input-box" }, p = ["type", "placeholder"], m = ["src"], h = /* @__PURE__ */ r({
4
+ name: "Input",
4
5
  __name: "input",
5
6
  props: /* @__PURE__ */ i({
6
7
  placeholder: { default: "" },
@@ -1 +1 @@
1
- .input-box[data-v-f5f052a7]{will-change:border-color;box-sizing:border-box;border-bottom:1px solid #00000029;align-items:center;gap:16px;height:60px;padding:16px 0;transition:border-color .2s ease-in-out;display:flex}.input-box[data-v-f5f052a7]:focus-within{border-color:#000}.input-box input[data-v-f5f052a7]{width:100%;height:100%;font-size:inherit;border:none;outline:none}input[data-v-f5f052a7]::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-f5f052a7]::-moz-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-f5f052a7]:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}.input-box img[data-v-f5f052a7]{-o-object-fit:contain;object-fit:contain;cursor:pointer;width:24px;height:24px}
1
+ .input-box[data-v-56cf72b9]{will-change:border-color;box-sizing:border-box;border-bottom:1px solid #00000029;align-items:center;gap:16px;height:60px;padding:16px 0;transition:border-color .2s ease-in-out;display:flex}.input-box[data-v-56cf72b9]:focus-within{border-color:#000}.input-box input[data-v-56cf72b9]{width:100%;height:100%;font-size:inherit;border:none;outline:none}input[data-v-56cf72b9]::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-56cf72b9]::-moz-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-56cf72b9]:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}.input-box img[data-v-56cf72b9]{-o-object-fit:contain;object-fit:contain;cursor:pointer;width:24px;height:24px}
@@ -0,0 +1,7 @@
1
+ import e from "./menu.js";
2
+ import "./style.css";
3
+ //#region components/menu/index.ts
4
+ e.install = (t) => (e.name && t.component(e.name, e), t);
5
+ var t = e;
6
+ //#endregion
7
+ export { t as default };
@@ -0,0 +1,5 @@
1
+ import e from "./menu-item.vue_vue_type_script_setup_true_lang.js";
2
+ //#region components/menu/menu-item.vue
3
+ var t = e;
4
+ //#endregion
5
+ export { t as default };
@@ -0,0 +1,97 @@
1
+ import { Fragment as e, Transition as t, createBlock as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, defineComponent as o, mergeModels as s, normalizeClass as c, openBlock as l, ref as u, renderList as d, resolveComponent as f, toDisplayString as p, useModel as m, withCtx as h } from "vue";
2
+ //#region components/menu/menu-item.vue?vue&type=script&setup=true&lang.ts
3
+ var g = { class: "menu-label" }, _ = ["src"], v = ["src"], y = /* @__PURE__ */ o({
4
+ name: "MenuItem",
5
+ __name: "menu-item",
6
+ props: /* @__PURE__ */ s({
7
+ checkedIcon: {},
8
+ checkedIconClass: {},
9
+ suffixIcon: {},
10
+ suffixIconClass: {},
11
+ itemContainerClass: {},
12
+ itemGap: {},
13
+ activeItemClass: {},
14
+ subMenuContainerClass: {},
15
+ deep: {},
16
+ item: {},
17
+ parentValue: {}
18
+ }, {
19
+ modelValue: {
20
+ type: Array,
21
+ default: () => []
22
+ },
23
+ modelModifiers: {}
24
+ }),
25
+ emits: ["update:modelValue"],
26
+ setup(o) {
27
+ let s = m(o, "modelValue"), y = o, b = u(!1), x = () => b.value = !0, S = () => b.value = !1, C = () => {
28
+ y.item.children?.length || (s.value = [...y.parentValue, y.item.value]);
29
+ };
30
+ return (u, m) => {
31
+ let w = f("MenuItem", !0);
32
+ return l(), i("div", {
33
+ onMouseenter: x,
34
+ onMouseleave: S,
35
+ style: { padding: "0 8px" }
36
+ }, [a("div", {
37
+ class: c(["menu-item-inner", [
38
+ y.itemContainerClass,
39
+ { active: s.value?.[y.deep] === o.item.value },
40
+ { [y.activeItemClass]: s.value?.[y.deep] === o.item.value }
41
+ ]]),
42
+ onClick: C
43
+ }, [
44
+ a("div", g, p(o.item.label), 1),
45
+ o.suffixIcon && o.item.children?.length ? (l(), i("img", {
46
+ key: 0,
47
+ src: y.suffixIcon,
48
+ class: c(["suffix-icon", y.suffixIconClass]),
49
+ alt: "suffix-icon"
50
+ }, null, 10, _)) : r("", !0),
51
+ o.checkedIcon && !o.item.children?.length && s.value?.[y.deep] === o.item.value ? (l(), i("img", {
52
+ key: 1,
53
+ src: y.checkedIcon,
54
+ class: c(["checked-icon", y.checkedIconClass]),
55
+ alt: "checked-icon"
56
+ }, null, 10, v)) : r("", !0)
57
+ ], 2), o.item.children?.length ? (l(), n(t, {
58
+ key: 0,
59
+ name: "fade"
60
+ }, {
61
+ default: h(() => [b.value ? (l(), i("div", {
62
+ key: 0,
63
+ class: c(["sub-menu-box list-box", o.subMenuContainerClass])
64
+ }, [(l(!0), i(e, null, d(o.item.children, (e, t) => (l(), n(w, {
65
+ key: t,
66
+ modelValue: s.value,
67
+ "onUpdate:modelValue": m[0] ||= (e) => s.value = e,
68
+ item: e,
69
+ "suffix-icon": o.suffixIcon,
70
+ "suffix-icon-class": o.suffixIconClass,
71
+ "checked-icon": o.checkedIcon,
72
+ "checked-icon-class": o.checkedIconClass,
73
+ "item-container-class": o.itemContainerClass,
74
+ "item-gap": o.itemGap,
75
+ deep: y.deep + 1,
76
+ "active-item-class": y.activeItemClass,
77
+ "parent-value": y.parentValue.concat(o.item.value)
78
+ }, null, 8, [
79
+ "modelValue",
80
+ "item",
81
+ "suffix-icon",
82
+ "suffix-icon-class",
83
+ "checked-icon",
84
+ "checked-icon-class",
85
+ "item-container-class",
86
+ "item-gap",
87
+ "deep",
88
+ "active-item-class",
89
+ "parent-value"
90
+ ]))), 128))], 2)) : r("", !0)]),
91
+ _: 1
92
+ })) : r("", !0)], 32);
93
+ };
94
+ }
95
+ });
96
+ //#endregion
97
+ export { y as default };
@@ -0,0 +1,7 @@
1
+ import e from "../_virtual/_plugin-vue_export-helper.js";
2
+ import t from "./menu.vue_vue_type_script_setup_true_lang.js";
3
+ /* empty css */
4
+ //#region components/menu/menu.vue
5
+ var n = /* @__PURE__ */ e(t, [["__scopeId", "data-v-fbfe58be"]]);
6
+ //#endregion
7
+ export { n as default };
@@ -0,0 +1,82 @@
1
+ import e from "./menu-item.js";
2
+ import { Fragment as t, Transition as n, createCommentVNode as r, createElementBlock as i, createElementVNode as a, createVNode as o, defineComponent as s, mergeModels as c, normalizeClass as l, normalizeStyle as u, openBlock as d, ref as f, renderList as p, renderSlot as m, useModel as h, watch as g, withCtx as _ } from "vue";
3
+ //#region components/menu/menu.vue?vue&type=script&setup=true&lang.ts
4
+ var v = {
5
+ key: 0,
6
+ class: "menu-list-box"
7
+ }, y = /* @__PURE__ */ s({
8
+ name: "Menu",
9
+ __name: "menu",
10
+ props: /* @__PURE__ */ c({
11
+ duration: { default: 100 },
12
+ items: { default: () => [] },
13
+ suffixIcon: {},
14
+ suffixIconClass: {},
15
+ checkedIcon: {},
16
+ checkedIconClass: {},
17
+ listContainerClass: { default: "" },
18
+ subMenuContainerClass: { default: "" },
19
+ defaultContainerClass: { default: "" },
20
+ itemContainerClass: {},
21
+ itemGap: { default: "4px" },
22
+ activeItemClass: { default: "" }
23
+ }, {
24
+ modelValue: {
25
+ type: Array,
26
+ default: () => []
27
+ },
28
+ modelModifiers: {}
29
+ }),
30
+ emits: /* @__PURE__ */ c(["open", "close"], ["update:modelValue"]),
31
+ setup(s, { emit: c }) {
32
+ let y = c, b = h(s, "modelValue"), x = s, S = f(!1), C = () => S.value = !0, w = () => S.value = !1;
33
+ return g(b, () => {
34
+ S.value = !1;
35
+ }), g(S, (e) => {
36
+ y(e ? "open" : "close");
37
+ }), (c, f) => (d(), i("div", {
38
+ class: "menu-box",
39
+ style: u({ "--duration": x.duration + "ms" })
40
+ }, [a("div", {
41
+ class: l(["default-box", x.defaultContainerClass]),
42
+ onMouseenter: C,
43
+ onMouseleave: w
44
+ }, [m(c.$slots, "default", {}, void 0, !0), o(n, { name: "fade" }, {
45
+ default: _(() => [S.value ? (d(), i("div", v, [a("div", {
46
+ class: l(["menu-item-box", x.listContainerClass]),
47
+ style: u({ "--gap": x.itemGap })
48
+ }, [(d(!0), i(t, null, p(x.items, (t, n) => (d(), i("div", {
49
+ key: n,
50
+ class: "menu-item"
51
+ }, [o(e, {
52
+ modelValue: b.value,
53
+ "onUpdate:modelValue": f[0] ||= (e) => b.value = e,
54
+ item: t,
55
+ "suffix-icon": s.suffixIcon,
56
+ "suffix-icon-class": s.suffixIconClass,
57
+ "checked-icon": s.checkedIcon,
58
+ "checked-icon-class": s.checkedIconClass,
59
+ "item-container-class": s.itemContainerClass,
60
+ "item-gap": x.itemGap,
61
+ deep: 0,
62
+ "active-item-class": x.activeItemClass,
63
+ "sub-menu-container-class": x.subMenuContainerClass,
64
+ "parent-value": []
65
+ }, null, 8, [
66
+ "modelValue",
67
+ "item",
68
+ "suffix-icon",
69
+ "suffix-icon-class",
70
+ "checked-icon",
71
+ "checked-icon-class",
72
+ "item-container-class",
73
+ "item-gap",
74
+ "active-item-class",
75
+ "sub-menu-container-class"
76
+ ])]))), 128))], 6)])) : r("", !0)]),
77
+ _: 1
78
+ })], 34)], 4));
79
+ }
80
+ });
81
+ //#endregion
82
+ export { y as default };
@@ -0,0 +1 @@
1
+ .menu-box[data-v-fbfe58be]{display:inline-flex;position:relative}.default-box[data-v-fbfe58be]{box-sizing:border-box;border:1px solid #000;align-items:center;min-width:240px;min-height:30px;padding:8px 16px;display:flex}.fade-enter-from[data-v-fbfe58be],[data-v-fbfe58be] .fade-enter-from,.fade-leave-to[data-v-fbfe58be],[data-v-fbfe58be] .fade-leave-to{opacity:0}.fade-enter-active[data-v-fbfe58be],[data-v-fbfe58be] .fade-enter-active,.fade-leave-active[data-v-fbfe58be],[data-v-fbfe58be] .fade-leave-active{transition:opacity var(--duration) ease-in-out}.menu-list-box[data-v-fbfe58be]{z-index:99;box-sizing:border-box;width:100%;padding-top:8px;position:absolute;top:100%;left:0}.menu-item-box[data-v-fbfe58be]{gap:var(--gap);box-sizing:border-box;background-color:#fff;flex-direction:column;width:100%;padding:16px 0;display:flex;position:relative;box-shadow:0 0 16px #0000000f}[data-v-fbfe58be] .menu-item-inner{box-sizing:border-box;cursor:pointer;will-change:background-color;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;width:100%;height:40px;padding:0 16px;transition:background-color .1s linear;display:flex}[data-v-fbfe58be] .menu-item-inner.active,[data-v-fbfe58be] .menu-item-inner:hover{background-color:#f8f9f9}[data-v-fbfe58be] .menu-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}[data-v-fbfe58be] .sub-menu-box{z-index:99;gap:var(--gap);box-sizing:border-box;background-color:#fff;border-left:1px solid #0000000f;flex-direction:column;padding:16px 8px;display:flex;position:absolute;top:0;left:100%;box-shadow:0 -16px 16px -16px #0000000f,16px 0 16px -16px #0000000f,0 16px 16px -16px #0000000f}[data-v-fbfe58be] .suffix-icon,[data-v-fbfe58be] .checked-icon{-o-object-fit:contain;object-fit:contain;width:18px;height:18px}
File without changes
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vue`)):typeof define==`function`&&define.amd?define([`exports`,`vue`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`rox-v`]={},e.Vue))})(this,function(e,t){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var n=Object.defineProperty,r=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},i=[`inputmode`,`maxlength`],a=(0,t.defineComponent)({name:`InputOtp`,__name:`input-otp`,props:{modelValue:{default:``},length:{default:6},itemClass:{default:``},activeItemClass:{default:``},gap:{default:`10px`},hasFilledItemClass:{default:`active`},type:{default:`number`}},emits:[`update:modelValue`,`complete`,`enter`],setup(e,{emit:n}){let r=[`ArrowLeft`,`ArrowRight`,`Home`,`End`],a=e,o=n,s=(0,t.ref)(null),c=(0,t.ref)(a.modelValue);(0,t.watch)(()=>a.modelValue,e=>{e!==c.value&&(c.value=e)});function l(e){let t=e.target.value;t=a.type===`text`?t.replace(/[^\dA-Za-z]/g,``):t.replace(/\D/g,``),t=t.slice(0,a.length),c.value=t,o(`update:modelValue`,t),t.length===a.length&&o(`complete`,t)}function u(){(0,t.nextTick)(()=>{if(s.value){let e=c.value.length;s.value.setSelectionRange?.(e,e)}})}function d(e){let t=c.value,n=e.key;if(n===`Backspace`||n===`Delete`){if(e.preventDefault(),t.length>0){let e=t.slice(0,-1);c.value=e,o(`update:modelValue`,e),u()}}else r.includes(n)&&e.preventDefault()}function f(){a.modelValue.length>=a.length&&o(`enter`)}function p(){s.value?.focus()}function m(e){return e===c.value.length}function h(e){return e<c.value.length}return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`otp-wrapper`,onClick:p},[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{inputmode:a.type===`text`?`text`:`numeric`,autocomplete:`one-time-code`,ref_key:`inputRef`,ref:s,"onUpdate:modelValue":r[0]||=e=>c.value=e,maxlength:e.length,onInput:l,onKeydown:d,onKeyup:(0,t.withKeys)(f,[`enter`]),onFocus:u,style:{position:`absolute`,opacity:`0`,"pointer-events":`none`,width:`1px`,height:`1px`}},null,40,i),[[t.vModelText,c.value]]),(0,t.createElementVNode)(`div`,{class:`otp-box`,style:(0,t.normalizeStyle)({gap:a.gap})},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.length,(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:n,class:(0,t.normalizeClass)([`otp-item`,[{[a.activeItemClass]:m(n)},{[a.hasFilledItemClass]:h(n)},a.itemClass]])},(0,t.toDisplayString)(c.value[n]||``),3))),128))],4)]))}}),o=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},s=o(a,[[`__scopeId`,`data-v-e8da3c38`]]);s.install=e=>(s.name&&e.component(s.name,s),e);var c=s,l=o((0,t.defineComponent)({name:`Popup`,__name:`popup`,props:(0,t.mergeModels)({to:{default:`body`},bg:{default:`rgba(0, 0, 0, .5)`},duration:{default:300},position:{default:`bottom`},maskClosable:{type:Boolean,default:!0},top:{default:`0px`},left:{default:`0px`},right:{default:`0px`},bottom:{default:`0px`},zIndex:{default:50}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let n=[`bottom`,`left`,`right`,`top`,`center`],r=(0,t.useModel)(e,`modelValue`),i=e;function a(){i.maskClosable&&(r.value=!1)}return(e,o)=>((0,t.openBlock)(),(0,t.createBlock)(t.Teleport,{to:i.to},[(0,t.createVNode)(t.Transition,{name:`fade`},{default:(0,t.withCtx)(()=>[r.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,style:(0,t.normalizeStyle)({"--duration":`${i.duration}ms`,backgroundColor:i.bg,top:i.top,left:i.left,right:i.right,bottom:i.bottom,zIndex:i.zIndex}),class:(0,t.normalizeClass)([`popup-container`,[`popup-container-${i.position}`,{"popup-container-bottom":!n.includes(i.position)}]]),onClick:a},[(0,t.createElementVNode)(`div`,{class:`popup-content`,onClick:o[0]||=(0,t.withModifiers)(()=>{},[`stop`])},[(0,t.renderSlot)(e.$slots,`default`,{},void 0,!0)])],6)):(0,t.createCommentVNode)(``,!0)]),_:3})],8,[`to`]))}}),[[`__scopeId`,`data-v-f6d3cf05`]]);l.install=e=>(l.name&&e.component(l.name,l),e);var u=l,d=[`type`],f=o((0,t.defineComponent)({name:`Button`,__name:`button`,props:{padding:{default:`8px 16px`},block:{type:Boolean,default:!1},bg:{default:`transparent`},border:{default:`1px solid #1A171B`},radius:{default:`0`},disabled:{type:Boolean,default:!1},type:{default:`button`},disabledBg:{default:`rgba(26,23,27,0.16)`},enableDisabledClick:{type:Boolean,default:!1}},emits:[`click`],setup(e,{emit:n}){let r=n,i=e,a=e=>{(!i.disabled||i.enableDisabledClick)&&r(`click`,e)};return(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`button`,{onClick:a,class:(0,t.normalizeClass)([`button-container`,{block:i.block,disabled:i.disabled}]),type:i.type,style:(0,t.normalizeStyle)({padding:i.padding,border:i.border,borderRadius:i.radius,"--bg":i.bg,"--disabled-bg":i.disabledBg})},[(0,t.renderSlot)(e.$slots,`default`,{},void 0,!0)],14,d))}}),[[`__scopeId`,`data-v-f38282d0`]]);f.install=e=>(f.name&&e.component(f.name,f),e);var p=f,m=o((0,t.defineComponent)({__name:`collapse`,props:{open:{type:Boolean,default:!1},maxHeight:{default:`100dvh`},duration:{default:300}},setup(e){let n=e;return(e,r)=>((0,t.openBlock)(),(0,t.createBlock)(t.Transition,{name:`collapse`},{default:(0,t.withCtx)(()=>[n.open?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:`collapse-content`,style:(0,t.normalizeStyle)({"--max-height":n.maxHeight,"--duration":n.duration+`ms`})},[(0,t.renderSlot)(e.$slots,`default`,{},void 0,!0)],4)):(0,t.createCommentVNode)(``,!0)]),_:3}))}}),[[`__scopeId`,`data-v-cea8a740`]]);m.install=e=>(m.name&&e.component(m.name,m),e);var h=m,g={class:`input-box`},_=[`type`,`placeholder`],v=[`src`],y=o((0,t.defineComponent)({__name:`input`,props:(0,t.mergeModels)({placeholder:{default:``},type:{default:`text`},iconVisible:{type:Boolean,default:!1},icon:{default:``}},{modelValue:{type:String,default:``},modelModifiers:{}}),emits:(0,t.mergeModels)([`click`,`enter`],[`update:modelValue`]),setup(e,{emit:n}){let r=n,i=(0,t.useTemplateRef)(`input`),a=(0,t.useModel)(e,`modelValue`),o=e,s=()=>{r(`click`),i.value?.focus?.(),setTimeout(()=>{let e=a.value.length;i.value?.setSelectionRange?.(e,e)},0)};return(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,g,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{type:o.type,"onUpdate:modelValue":n[0]||=e=>a.value=e,ref:`input`,placeholder:o.placeholder,onKeyup:n[1]||=(0,t.withKeys)(t=>e.$emit(`enter`),[`enter`])},null,40,_),[[t.vModelDynamic,a.value]]),o.icon?(0,t.withDirectives)(((0,t.openBlock)(),(0,t.createElementBlock)(`img`,{key:0,src:o.icon,alt:`icon`,onClick:s},null,8,v)),[[t.vShow,o.iconVisible]]):(0,t.createCommentVNode)(``,!0)]))}}),[[`__scopeId`,`data-v-f5f052a7`]]);y.install=e=>(y.name&&e.component(y.name,y),e);var b=y,x=r({Button:()=>p,Collapse:()=>h,Input:()=>b,InputOtp:()=>c,Popup:()=>u}),S=e=>(Object.keys(x).forEach(t=>{let n=x[t];n.install&&e.use(n)}),e),C={install:S};e.Button=p,e.Collapse=h,e.Input=b,e.InputOtp=c,e.Popup=u,e.default=C,e.install=S});
1
+ (function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vue`)):typeof define==`function`&&define.amd?define([`exports`,`vue`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e[`rox-v`]={},e.Vue))})(this,function(e,t){Object.defineProperties(e,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});var n=Object.defineProperty,r=(e,t)=>{let r={};for(var i in e)n(r,i,{get:e[i],enumerable:!0});return t||n(r,Symbol.toStringTag,{value:`Module`}),r},i=[`inputmode`,`maxlength`],a=(0,t.defineComponent)({name:`InputOtp`,__name:`input-otp`,props:{modelValue:{default:``},length:{default:6},itemClass:{default:``},activeItemClass:{default:``},gap:{default:`10px`},hasFilledItemClass:{default:`active`},type:{default:`number`}},emits:[`update:modelValue`,`complete`,`enter`],setup(e,{emit:n}){let r=[`ArrowLeft`,`ArrowRight`,`Home`,`End`],a=e,o=n,s=(0,t.ref)(null),c=(0,t.ref)(a.modelValue);(0,t.watch)(()=>a.modelValue,e=>{e!==c.value&&(c.value=e)});function l(e){let t=e.target.value;t=a.type===`text`?t.replace(/[^\dA-Za-z]/g,``):t.replace(/\D/g,``),t=t.slice(0,a.length),c.value=t,o(`update:modelValue`,t),t.length===a.length&&o(`complete`,t)}function u(){(0,t.nextTick)(()=>{if(s.value){let e=c.value.length;s.value.setSelectionRange?.(e,e)}})}function d(e){let t=c.value,n=e.key;if(n===`Backspace`||n===`Delete`){if(e.preventDefault(),t.length>0){let e=t.slice(0,-1);c.value=e,o(`update:modelValue`,e),u()}}else r.includes(n)&&e.preventDefault()}function f(){a.modelValue.length>=a.length&&o(`enter`)}function p(){s.value?.focus()}function m(e){return e===c.value.length}function h(e){return e<c.value.length}return(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`otp-wrapper`,onClick:p},[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{inputmode:a.type===`text`?`text`:`numeric`,autocomplete:`one-time-code`,ref_key:`inputRef`,ref:s,"onUpdate:modelValue":r[0]||=e=>c.value=e,maxlength:e.length,onInput:l,onKeydown:d,onKeyup:(0,t.withKeys)(f,[`enter`]),onFocus:u,style:{position:`absolute`,opacity:`0`,"pointer-events":`none`,width:`1px`,height:`1px`}},null,40,i),[[t.vModelText,c.value]]),(0,t.createElementVNode)(`div`,{class:`otp-box`,style:(0,t.normalizeStyle)({gap:a.gap})},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.length,(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:n,class:(0,t.normalizeClass)([`otp-item`,[{[a.activeItemClass]:m(n)},{[a.hasFilledItemClass]:h(n)},a.itemClass]])},(0,t.toDisplayString)(c.value[n]||``),3))),128))],4)]))}}),o=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},s=o(a,[[`__scopeId`,`data-v-e8da3c38`]]);s.install=e=>(s.name&&e.component(s.name,s),e);var c=s,l=o((0,t.defineComponent)({name:`Popup`,__name:`popup`,props:(0,t.mergeModels)({to:{default:`body`},bg:{default:`rgba(0, 0, 0, .5)`},duration:{default:300},position:{default:`bottom`},maskClosable:{type:Boolean,default:!0},top:{default:`0px`},left:{default:`0px`},right:{default:`0px`},bottom:{default:`0px`},zIndex:{default:50}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let n=[`bottom`,`left`,`right`,`top`,`center`],r=(0,t.useModel)(e,`modelValue`),i=e;function a(){i.maskClosable&&(r.value=!1)}return(e,o)=>((0,t.openBlock)(),(0,t.createBlock)(t.Teleport,{to:i.to},[(0,t.createVNode)(t.Transition,{name:`fade`},{default:(0,t.withCtx)(()=>[r.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,style:(0,t.normalizeStyle)({"--duration":`${i.duration}ms`,backgroundColor:i.bg,top:i.top,left:i.left,right:i.right,bottom:i.bottom,zIndex:i.zIndex}),class:(0,t.normalizeClass)([`popup-container`,[`popup-container-${i.position}`,{"popup-container-bottom":!n.includes(i.position)}]]),onClick:a},[(0,t.createElementVNode)(`div`,{class:`popup-content`,onClick:o[0]||=(0,t.withModifiers)(()=>{},[`stop`])},[(0,t.renderSlot)(e.$slots,`default`,{},void 0,!0)])],6)):(0,t.createCommentVNode)(``,!0)]),_:3})],8,[`to`]))}}),[[`__scopeId`,`data-v-f6d3cf05`]]);l.install=e=>(l.name&&e.component(l.name,l),e);var u=l,d=[`type`],f=o((0,t.defineComponent)({name:`Button`,__name:`button`,props:{padding:{default:`8px 16px`},block:{type:Boolean,default:!1},bg:{default:`transparent`},border:{default:`1px solid #1A171B`},radius:{default:`0`},disabled:{type:Boolean,default:!1},type:{default:`button`},disabledBg:{default:`rgba(26,23,27,0.16)`},enableDisabledClick:{type:Boolean,default:!1}},emits:[`click`],setup(e,{emit:n}){let r=n,i=e,a=e=>{(!i.disabled||i.enableDisabledClick)&&r(`click`,e)};return(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`button`,{onClick:a,class:(0,t.normalizeClass)([`button-container`,{block:i.block,disabled:i.disabled}]),type:i.type,style:(0,t.normalizeStyle)({padding:i.padding,border:i.border,borderRadius:i.radius,"--bg":i.bg,"--disabled-bg":i.disabledBg})},[(0,t.renderSlot)(e.$slots,`default`,{},void 0,!0)],14,d))}}),[[`__scopeId`,`data-v-f38282d0`]]);f.install=e=>(f.name&&e.component(f.name,f),e);var p=f,m=o((0,t.defineComponent)({name:`Collapse`,__name:`collapse`,props:{open:{type:Boolean,default:!1},maxHeight:{default:`100dvh`},duration:{default:300}},setup(e){let n=e;return(e,r)=>((0,t.openBlock)(),(0,t.createBlock)(t.Transition,{name:`collapse`},{default:(0,t.withCtx)(()=>[n.open?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:`collapse-content`,style:(0,t.normalizeStyle)({"--max-height":n.maxHeight,"--duration":n.duration+`ms`})},[(0,t.renderSlot)(e.$slots,`default`,{},void 0,!0)],4)):(0,t.createCommentVNode)(``,!0)]),_:3}))}}),[[`__scopeId`,`data-v-cc071022`]]);m.install=e=>(m.name&&e.component(m.name,m),e);var h=m,g={class:`input-box`},_=[`type`,`placeholder`],v=[`src`],y=o((0,t.defineComponent)({name:`Input`,__name:`input`,props:(0,t.mergeModels)({placeholder:{default:``},type:{default:`text`},iconVisible:{type:Boolean,default:!1},icon:{default:``}},{modelValue:{type:String,default:``},modelModifiers:{}}),emits:(0,t.mergeModels)([`click`,`enter`],[`update:modelValue`]),setup(e,{emit:n}){let r=n,i=(0,t.useTemplateRef)(`input`),a=(0,t.useModel)(e,`modelValue`),o=e,s=()=>{r(`click`),i.value?.focus?.(),setTimeout(()=>{let e=a.value.length;i.value?.setSelectionRange?.(e,e)},0)};return(e,n)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,g,[(0,t.withDirectives)((0,t.createElementVNode)(`input`,{type:o.type,"onUpdate:modelValue":n[0]||=e=>a.value=e,ref:`input`,placeholder:o.placeholder,onKeyup:n[1]||=(0,t.withKeys)(t=>e.$emit(`enter`),[`enter`])},null,40,_),[[t.vModelDynamic,a.value]]),o.icon?(0,t.withDirectives)(((0,t.openBlock)(),(0,t.createElementBlock)(`img`,{key:0,src:o.icon,alt:`icon`,onClick:s},null,8,v)),[[t.vShow,o.iconVisible]]):(0,t.createCommentVNode)(``,!0)]))}}),[[`__scopeId`,`data-v-56cf72b9`]]);y.install=e=>(y.name&&e.component(y.name,y),e);var b=y,x={class:`menu-label`},S=[`src`],C=[`src`],w=(0,t.defineComponent)({name:`MenuItem`,__name:`menu-item`,props:(0,t.mergeModels)({checkedIcon:{},checkedIconClass:{},suffixIcon:{},suffixIconClass:{},itemContainerClass:{},itemGap:{},activeItemClass:{},subMenuContainerClass:{},deep:{},item:{},parentValue:{}},{modelValue:{type:Array,default:()=>[]},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let n=(0,t.useModel)(e,`modelValue`),r=e,i=(0,t.ref)(!1),a=()=>i.value=!0,o=()=>i.value=!1,s=()=>{r.item.children?.length||(n.value=[...r.parentValue,r.item.value])};return(c,l)=>{let u=(0,t.resolveComponent)(`MenuItem`,!0);return(0,t.openBlock)(),(0,t.createElementBlock)(`div`,{onMouseenter:a,onMouseleave:o,style:{padding:`0 8px`}},[(0,t.createElementVNode)(`div`,{class:(0,t.normalizeClass)([`menu-item-inner`,[r.itemContainerClass,{active:n.value?.[r.deep]===e.item.value},{[r.activeItemClass]:n.value?.[r.deep]===e.item.value}]]),onClick:s},[(0,t.createElementVNode)(`div`,x,(0,t.toDisplayString)(e.item.label),1),e.suffixIcon&&e.item.children?.length?((0,t.openBlock)(),(0,t.createElementBlock)(`img`,{key:0,src:r.suffixIcon,class:(0,t.normalizeClass)([`suffix-icon`,r.suffixIconClass]),alt:`suffix-icon`},null,10,S)):(0,t.createCommentVNode)(``,!0),e.checkedIcon&&!e.item.children?.length&&n.value?.[r.deep]===e.item.value?((0,t.openBlock)(),(0,t.createElementBlock)(`img`,{key:1,src:r.checkedIcon,class:(0,t.normalizeClass)([`checked-icon`,r.checkedIconClass]),alt:`checked-icon`},null,10,C)):(0,t.createCommentVNode)(``,!0)],2),e.item.children?.length?((0,t.openBlock)(),(0,t.createBlock)(t.Transition,{key:0,name:`fade`},{default:(0,t.withCtx)(()=>[i.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,class:(0,t.normalizeClass)([`sub-menu-box list-box`,e.subMenuContainerClass])},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(e.item.children,(i,a)=>((0,t.openBlock)(),(0,t.createBlock)(u,{key:a,modelValue:n.value,"onUpdate:modelValue":l[0]||=e=>n.value=e,item:i,"suffix-icon":e.suffixIcon,"suffix-icon-class":e.suffixIconClass,"checked-icon":e.checkedIcon,"checked-icon-class":e.checkedIconClass,"item-container-class":e.itemContainerClass,"item-gap":e.itemGap,deep:r.deep+1,"active-item-class":r.activeItemClass,"parent-value":r.parentValue.concat(e.item.value)},null,8,[`modelValue`,`item`,`suffix-icon`,`suffix-icon-class`,`checked-icon`,`checked-icon-class`,`item-container-class`,`item-gap`,`deep`,`active-item-class`,`parent-value`]))),128))],2)):(0,t.createCommentVNode)(``,!0)]),_:1})):(0,t.createCommentVNode)(``,!0)],32)}}}),T={key:0,class:`menu-list-box`},E=o((0,t.defineComponent)({name:`Menu`,__name:`menu`,props:(0,t.mergeModels)({duration:{default:100},items:{default:()=>[]},suffixIcon:{},suffixIconClass:{},checkedIcon:{},checkedIconClass:{},listContainerClass:{default:``},subMenuContainerClass:{default:``},defaultContainerClass:{default:``},itemContainerClass:{},itemGap:{default:`4px`},activeItemClass:{default:``}},{modelValue:{type:Array,default:()=>[]},modelModifiers:{}}),emits:(0,t.mergeModels)([`open`,`close`],[`update:modelValue`]),setup(e,{emit:n}){let r=n,i=(0,t.useModel)(e,`modelValue`),a=e,o=(0,t.ref)(!1),s=()=>o.value=!0,c=()=>o.value=!1;return(0,t.watch)(i,()=>{o.value=!1}),(0,t.watch)(o,e=>{r(e?`open`:`close`)}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`menu-box`,style:(0,t.normalizeStyle)({"--duration":a.duration+`ms`})},[(0,t.createElementVNode)(`div`,{class:(0,t.normalizeClass)([`default-box`,a.defaultContainerClass]),onMouseenter:s,onMouseleave:c},[(0,t.renderSlot)(n.$slots,`default`,{},void 0,!0),(0,t.createVNode)(t.Transition,{name:`fade`},{default:(0,t.withCtx)(()=>[o.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,T,[(0,t.createElementVNode)(`div`,{class:(0,t.normalizeClass)([`menu-item-box`,a.listContainerClass]),style:(0,t.normalizeStyle)({"--gap":a.itemGap})},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(a.items,(n,o)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:o,class:`menu-item`},[(0,t.createVNode)(w,{modelValue:i.value,"onUpdate:modelValue":r[0]||=e=>i.value=e,item:n,"suffix-icon":e.suffixIcon,"suffix-icon-class":e.suffixIconClass,"checked-icon":e.checkedIcon,"checked-icon-class":e.checkedIconClass,"item-container-class":e.itemContainerClass,"item-gap":a.itemGap,deep:0,"active-item-class":a.activeItemClass,"sub-menu-container-class":a.subMenuContainerClass,"parent-value":[]},null,8,[`modelValue`,`item`,`suffix-icon`,`suffix-icon-class`,`checked-icon`,`checked-icon-class`,`item-container-class`,`item-gap`,`active-item-class`,`sub-menu-container-class`])]))),128))],6)])):(0,t.createCommentVNode)(``,!0)]),_:1})],34)],4))}}),[[`__scopeId`,`data-v-fbfe58be`]]);E.install=e=>(E.name&&e.component(E.name,E),e);var D=E,O=r({Button:()=>p,Collapse:()=>h,Input:()=>b,InputOtp:()=>c,Menu:()=>D,Popup:()=>u}),k=e=>(Object.keys(O).forEach(t=>{let n=O[t];n.install&&e.use(n)}),e),A={install:k};e.Button=p,e.Collapse=h,e.Input=b,e.InputOtp=c,e.Menu=D,e.Popup=u,e.default=A,e.install=k});
@@ -1 +1 @@
1
- const e=require(`../_virtual/_plugin-vue_export-helper.js`),t=require(`./collapse.vue_vue_type_script_setup_true_lang.js`);;/* empty css */var n=e.default(t.default,[[`__scopeId`,`data-v-cea8a740`]]);exports.default=n;
1
+ const e=require(`../_virtual/_plugin-vue_export-helper.js`),t=require(`./collapse.vue_vue_type_script_setup_true_lang.js`);;/* empty css */var n=e.default(t.default,[[`__scopeId`,`data-v-cc071022`]]);exports.default=n;
@@ -1 +1 @@
1
- let e=require(`vue`);var t=(0,e.defineComponent)({__name:`collapse`,props:{open:{type:Boolean,default:!1},maxHeight:{default:`100dvh`},duration:{default:300}},setup(t){let n=t;return(t,r)=>((0,e.openBlock)(),(0,e.createBlock)(e.Transition,{name:`collapse`},{default:(0,e.withCtx)(()=>[n.open?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`collapse-content`,style:(0,e.normalizeStyle)({"--max-height":n.maxHeight,"--duration":n.duration+`ms`})},[(0,e.renderSlot)(t.$slots,`default`,{},void 0,!0)],4)):(0,e.createCommentVNode)(``,!0)]),_:3}))}});exports.default=t;
1
+ let e=require(`vue`);var t=(0,e.defineComponent)({name:`Collapse`,__name:`collapse`,props:{open:{type:Boolean,default:!1},maxHeight:{default:`100dvh`},duration:{default:300}},setup(t){let n=t;return(t,r)=>((0,e.openBlock)(),(0,e.createBlock)(e.Transition,{name:`collapse`},{default:(0,e.withCtx)(()=>[n.open?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:`collapse-content`,style:(0,e.normalizeStyle)({"--max-height":n.maxHeight,"--duration":n.duration+`ms`})},[(0,e.renderSlot)(t.$slots,`default`,{},void 0,!0)],4)):(0,e.createCommentVNode)(``,!0)]),_:3}))}});exports.default=t;
@@ -1 +1 @@
1
- .collapse-content[data-v-cea8a740]{width:max-content}.collapse-enter-from[data-v-cea8a740],.collapse-leave-to[data-v-cea8a740]{max-height:0!important}.collapse-enter-active[data-v-cea8a740],.collapse-leave-active[data-v-cea8a740]{max-height:var(--max-height);transition:max-height var(--duration) ease-in-out;overflow:hidden}
1
+ .collapse-content[data-v-cc071022]{width:max-content}.collapse-enter-from[data-v-cc071022],.collapse-leave-to[data-v-cc071022]{max-height:0!important}.collapse-enter-active[data-v-cc071022],.collapse-leave-active[data-v-cc071022]{max-height:var(--max-height);transition:max-height var(--duration) ease-in-out;overflow:hidden}
@@ -1 +1 @@
1
- const e=require(`./_virtual/_rolldown/runtime.js`),t=require(`./input-otp/index.js`),n=require(`./popup/index.js`),r=require(`./button/index.js`),i=require(`./collapse/index.js`),a=require(`./input/index.js`);var o=e.__exportAll({Button:()=>r.default,Collapse:()=>i.default,Input:()=>a.default,InputOtp:()=>t.default,Popup:()=>n.default});Object.defineProperty(exports,`components_exports`,{enumerable:!0,get:function(){return o}});
1
+ const e=require(`./_virtual/_rolldown/runtime.js`),t=require(`./input-otp/index.js`),n=require(`./popup/index.js`),r=require(`./button/index.js`),i=require(`./collapse/index.js`),a=require(`./input/index.js`),o=require(`./menu/index.js`);var s=e.__exportAll({Button:()=>r.default,Collapse:()=>i.default,Input:()=>a.default,InputOtp:()=>t.default,Menu:()=>o.default,Popup:()=>n.default});Object.defineProperty(exports,`components_exports`,{enumerable:!0,get:function(){return s}});
package/dist/lib/index.js CHANGED
@@ -1 +1 @@
1
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require(`./input-otp/index.js`),t=require(`./popup/index.js`),n=require(`./button/index.js`),r=require(`./collapse/index.js`),i=require(`./input/index.js`),a=require(`./components.js`);;/* empty css */var o=e=>(Object.keys(a.components_exports).forEach(t=>{let n=a.components_exports[t];n.install&&e.use(n)}),e),s={install:o};exports.Button=n.default,exports.Collapse=r.default,exports.Input=i.default,exports.InputOtp=e.default,exports.Popup=t.default,exports.default=s,exports.install=o;
1
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}});const e=require(`./input-otp/index.js`),t=require(`./popup/index.js`),n=require(`./button/index.js`),r=require(`./collapse/index.js`),i=require(`./input/index.js`),a=require(`./menu/index.js`),o=require(`./components.js`);;/* empty css */var s=e=>(Object.keys(o.components_exports).forEach(t=>{let n=o.components_exports[t];n.install&&e.use(n)}),e),c={install:s};exports.Button=n.default,exports.Collapse=r.default,exports.Input=i.default,exports.InputOtp=e.default,exports.Menu=a.default,exports.Popup=t.default,exports.default=c,exports.install=s;
@@ -1 +1 @@
1
- const e=require(`../_virtual/_plugin-vue_export-helper.js`),t=require(`./input.vue_vue_type_script_setup_true_lang.js`);;/* empty css */var n=e.default(t.default,[[`__scopeId`,`data-v-f5f052a7`]]);exports.default=n;
1
+ const e=require(`../_virtual/_plugin-vue_export-helper.js`),t=require(`./input.vue_vue_type_script_setup_true_lang.js`);;/* empty css */var n=e.default(t.default,[[`__scopeId`,`data-v-56cf72b9`]]);exports.default=n;
@@ -1 +1 @@
1
- let e=require(`vue`);var t={class:`input-box`},n=[`type`,`placeholder`],r=[`src`],i=(0,e.defineComponent)({__name:`input`,props:(0,e.mergeModels)({placeholder:{default:``},type:{default:`text`},iconVisible:{type:Boolean,default:!1},icon:{default:``}},{modelValue:{type:String,default:``},modelModifiers:{}}),emits:(0,e.mergeModels)([`click`,`enter`],[`update:modelValue`]),setup(i,{emit:a}){let o=a,s=(0,e.useTemplateRef)(`input`),c=(0,e.useModel)(i,`modelValue`),l=i,u=()=>{o(`click`),s.value?.focus?.(),setTimeout(()=>{let e=c.value.length;s.value?.setSelectionRange?.(e,e)},0)};return(i,a)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,t,[(0,e.withDirectives)((0,e.createElementVNode)(`input`,{type:l.type,"onUpdate:modelValue":a[0]||=e=>c.value=e,ref:`input`,placeholder:l.placeholder,onKeyup:a[1]||=(0,e.withKeys)(e=>i.$emit(`enter`),[`enter`])},null,40,n),[[e.vModelDynamic,c.value]]),l.icon?(0,e.withDirectives)(((0,e.openBlock)(),(0,e.createElementBlock)(`img`,{key:0,src:l.icon,alt:`icon`,onClick:u},null,8,r)),[[e.vShow,l.iconVisible]]):(0,e.createCommentVNode)(``,!0)]))}});exports.default=i;
1
+ let e=require(`vue`);var t={class:`input-box`},n=[`type`,`placeholder`],r=[`src`],i=(0,e.defineComponent)({name:`Input`,__name:`input`,props:(0,e.mergeModels)({placeholder:{default:``},type:{default:`text`},iconVisible:{type:Boolean,default:!1},icon:{default:``}},{modelValue:{type:String,default:``},modelModifiers:{}}),emits:(0,e.mergeModels)([`click`,`enter`],[`update:modelValue`]),setup(i,{emit:a}){let o=a,s=(0,e.useTemplateRef)(`input`),c=(0,e.useModel)(i,`modelValue`),l=i,u=()=>{o(`click`),s.value?.focus?.(),setTimeout(()=>{let e=c.value.length;s.value?.setSelectionRange?.(e,e)},0)};return(i,a)=>((0,e.openBlock)(),(0,e.createElementBlock)(`div`,t,[(0,e.withDirectives)((0,e.createElementVNode)(`input`,{type:l.type,"onUpdate:modelValue":a[0]||=e=>c.value=e,ref:`input`,placeholder:l.placeholder,onKeyup:a[1]||=(0,e.withKeys)(e=>i.$emit(`enter`),[`enter`])},null,40,n),[[e.vModelDynamic,c.value]]),l.icon?(0,e.withDirectives)(((0,e.openBlock)(),(0,e.createElementBlock)(`img`,{key:0,src:l.icon,alt:`icon`,onClick:u},null,8,r)),[[e.vShow,l.iconVisible]]):(0,e.createCommentVNode)(``,!0)]))}});exports.default=i;
@@ -1 +1 @@
1
- .input-box[data-v-f5f052a7]{will-change:border-color;box-sizing:border-box;border-bottom:1px solid #00000029;align-items:center;gap:16px;height:60px;padding:16px 0;transition:border-color .2s ease-in-out;display:flex}.input-box[data-v-f5f052a7]:focus-within{border-color:#000}.input-box input[data-v-f5f052a7]{width:100%;height:100%;font-size:inherit;border:none;outline:none}input[data-v-f5f052a7]::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-f5f052a7]::-moz-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-f5f052a7]:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}.input-box img[data-v-f5f052a7]{-o-object-fit:contain;object-fit:contain;cursor:pointer;width:24px;height:24px}
1
+ .input-box[data-v-56cf72b9]{will-change:border-color;box-sizing:border-box;border-bottom:1px solid #00000029;align-items:center;gap:16px;height:60px;padding:16px 0;transition:border-color .2s ease-in-out;display:flex}.input-box[data-v-56cf72b9]:focus-within{border-color:#000}.input-box input[data-v-56cf72b9]{width:100%;height:100%;font-size:inherit;border:none;outline:none}input[data-v-56cf72b9]::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-56cf72b9]::-moz-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-56cf72b9]:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}.input-box img[data-v-56cf72b9]{-o-object-fit:contain;object-fit:contain;cursor:pointer;width:24px;height:24px}
@@ -0,0 +1 @@
1
+ const e=require(`./menu.js`);require(`./style.css`),e.default.install=t=>(e.default.name&&t.component(e.default.name,e.default),t);var t=e.default;exports.default=t;
@@ -0,0 +1 @@
1
+ var e=require(`./menu-item.vue_vue_type_script_setup_true_lang.js`).default;exports.default=e;
@@ -0,0 +1 @@
1
+ let e=require(`vue`);var t={class:`menu-label`},n=[`src`],r=[`src`],i=(0,e.defineComponent)({name:`MenuItem`,__name:`menu-item`,props:(0,e.mergeModels)({checkedIcon:{},checkedIconClass:{},suffixIcon:{},suffixIconClass:{},itemContainerClass:{},itemGap:{},activeItemClass:{},subMenuContainerClass:{},deep:{},item:{},parentValue:{}},{modelValue:{type:Array,default:()=>[]},modelModifiers:{}}),emits:[`update:modelValue`],setup(i){let a=(0,e.useModel)(i,`modelValue`),o=i,s=(0,e.ref)(!1),c=()=>s.value=!0,l=()=>s.value=!1,u=()=>{o.item.children?.length||(a.value=[...o.parentValue,o.item.value])};return(d,f)=>{let p=(0,e.resolveComponent)(`MenuItem`,!0);return(0,e.openBlock)(),(0,e.createElementBlock)(`div`,{onMouseenter:c,onMouseleave:l,style:{padding:`0 8px`}},[(0,e.createElementVNode)(`div`,{class:(0,e.normalizeClass)([`menu-item-inner`,[o.itemContainerClass,{active:a.value?.[o.deep]===i.item.value},{[o.activeItemClass]:a.value?.[o.deep]===i.item.value}]]),onClick:u},[(0,e.createElementVNode)(`div`,t,(0,e.toDisplayString)(i.item.label),1),i.suffixIcon&&i.item.children?.length?((0,e.openBlock)(),(0,e.createElementBlock)(`img`,{key:0,src:o.suffixIcon,class:(0,e.normalizeClass)([`suffix-icon`,o.suffixIconClass]),alt:`suffix-icon`},null,10,n)):(0,e.createCommentVNode)(``,!0),i.checkedIcon&&!i.item.children?.length&&a.value?.[o.deep]===i.item.value?((0,e.openBlock)(),(0,e.createElementBlock)(`img`,{key:1,src:o.checkedIcon,class:(0,e.normalizeClass)([`checked-icon`,o.checkedIconClass]),alt:`checked-icon`},null,10,r)):(0,e.createCommentVNode)(``,!0)],2),i.item.children?.length?((0,e.openBlock)(),(0,e.createBlock)(e.Transition,{key:0,name:`fade`},{default:(0,e.withCtx)(()=>[s.value?((0,e.openBlock)(),(0,e.createElementBlock)(`div`,{key:0,class:(0,e.normalizeClass)([`sub-menu-box list-box`,i.subMenuContainerClass])},[((0,e.openBlock)(!0),(0,e.createElementBlock)(e.Fragment,null,(0,e.renderList)(i.item.children,(t,n)=>((0,e.openBlock)(),(0,e.createBlock)(p,{key:n,modelValue:a.value,"onUpdate:modelValue":f[0]||=e=>a.value=e,item:t,"suffix-icon":i.suffixIcon,"suffix-icon-class":i.suffixIconClass,"checked-icon":i.checkedIcon,"checked-icon-class":i.checkedIconClass,"item-container-class":i.itemContainerClass,"item-gap":i.itemGap,deep:o.deep+1,"active-item-class":o.activeItemClass,"parent-value":o.parentValue.concat(i.item.value)},null,8,[`modelValue`,`item`,`suffix-icon`,`suffix-icon-class`,`checked-icon`,`checked-icon-class`,`item-container-class`,`item-gap`,`deep`,`active-item-class`,`parent-value`]))),128))],2)):(0,e.createCommentVNode)(``,!0)]),_:1})):(0,e.createCommentVNode)(``,!0)],32)}}});exports.default=i;
@@ -0,0 +1 @@
1
+ const e=require(`../_virtual/_plugin-vue_export-helper.js`),t=require(`./menu.vue_vue_type_script_setup_true_lang.js`);;/* empty css */var n=e.default(t.default,[[`__scopeId`,`data-v-fbfe58be`]]);exports.default=n;
@@ -0,0 +1 @@
1
+ const e=require(`./menu-item.js`);let t=require(`vue`);var n={key:0,class:`menu-list-box`},r=(0,t.defineComponent)({name:`Menu`,__name:`menu`,props:(0,t.mergeModels)({duration:{default:100},items:{default:()=>[]},suffixIcon:{},suffixIconClass:{},checkedIcon:{},checkedIconClass:{},listContainerClass:{default:``},subMenuContainerClass:{default:``},defaultContainerClass:{default:``},itemContainerClass:{},itemGap:{default:`4px`},activeItemClass:{default:``}},{modelValue:{type:Array,default:()=>[]},modelModifiers:{}}),emits:(0,t.mergeModels)([`open`,`close`],[`update:modelValue`]),setup(r,{emit:i}){let a=i,o=(0,t.useModel)(r,`modelValue`),s=r,c=(0,t.ref)(!1),l=()=>c.value=!0,u=()=>c.value=!1;return(0,t.watch)(o,()=>{c.value=!1}),(0,t.watch)(c,e=>{a(e?`open`:`close`)}),(i,a)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{class:`menu-box`,style:(0,t.normalizeStyle)({"--duration":s.duration+`ms`})},[(0,t.createElementVNode)(`div`,{class:(0,t.normalizeClass)([`default-box`,s.defaultContainerClass]),onMouseenter:l,onMouseleave:u},[(0,t.renderSlot)(i.$slots,`default`,{},void 0,!0),(0,t.createVNode)(t.Transition,{name:`fade`},{default:(0,t.withCtx)(()=>[c.value?((0,t.openBlock)(),(0,t.createElementBlock)(`div`,n,[(0,t.createElementVNode)(`div`,{class:(0,t.normalizeClass)([`menu-item-box`,s.listContainerClass]),style:(0,t.normalizeStyle)({"--gap":s.itemGap})},[((0,t.openBlock)(!0),(0,t.createElementBlock)(t.Fragment,null,(0,t.renderList)(s.items,(n,i)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:i,class:`menu-item`},[(0,t.createVNode)(e.default,{modelValue:o.value,"onUpdate:modelValue":a[0]||=e=>o.value=e,item:n,"suffix-icon":r.suffixIcon,"suffix-icon-class":r.suffixIconClass,"checked-icon":r.checkedIcon,"checked-icon-class":r.checkedIconClass,"item-container-class":r.itemContainerClass,"item-gap":s.itemGap,deep:0,"active-item-class":s.activeItemClass,"sub-menu-container-class":s.subMenuContainerClass,"parent-value":[]},null,8,[`modelValue`,`item`,`suffix-icon`,`suffix-icon-class`,`checked-icon`,`checked-icon-class`,`item-container-class`,`item-gap`,`active-item-class`,`sub-menu-container-class`])]))),128))],6)])):(0,t.createCommentVNode)(``,!0)]),_:1})],34)],4))}});exports.default=r;
@@ -0,0 +1 @@
1
+ .menu-box[data-v-fbfe58be]{display:inline-flex;position:relative}.default-box[data-v-fbfe58be]{box-sizing:border-box;border:1px solid #000;align-items:center;min-width:240px;min-height:30px;padding:8px 16px;display:flex}.fade-enter-from[data-v-fbfe58be],[data-v-fbfe58be] .fade-enter-from,.fade-leave-to[data-v-fbfe58be],[data-v-fbfe58be] .fade-leave-to{opacity:0}.fade-enter-active[data-v-fbfe58be],[data-v-fbfe58be] .fade-enter-active,.fade-leave-active[data-v-fbfe58be],[data-v-fbfe58be] .fade-leave-active{transition:opacity var(--duration) ease-in-out}.menu-list-box[data-v-fbfe58be]{z-index:99;box-sizing:border-box;width:100%;padding-top:8px;position:absolute;top:100%;left:0}.menu-item-box[data-v-fbfe58be]{gap:var(--gap);box-sizing:border-box;background-color:#fff;flex-direction:column;width:100%;padding:16px 0;display:flex;position:relative;box-shadow:0 0 16px #0000000f}[data-v-fbfe58be] .menu-item-inner{box-sizing:border-box;cursor:pointer;will-change:background-color;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;width:100%;height:40px;padding:0 16px;transition:background-color .1s linear;display:flex}[data-v-fbfe58be] .menu-item-inner.active,[data-v-fbfe58be] .menu-item-inner:hover{background-color:#f8f9f9}[data-v-fbfe58be] .menu-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}[data-v-fbfe58be] .sub-menu-box{z-index:99;gap:var(--gap);box-sizing:border-box;background-color:#fff;border-left:1px solid #0000000f;flex-direction:column;padding:16px 8px;display:flex;position:absolute;top:0;left:100%;box-shadow:0 -16px 16px -16px #0000000f,16px 0 16px -16px #0000000f,0 16px 16px -16px #0000000f}[data-v-fbfe58be] .suffix-icon,[data-v-fbfe58be] .checked-icon{-o-object-fit:contain;object-fit:contain;width:18px;height:18px}
File without changes
package/dist/style.css CHANGED
@@ -1,2 +1,2 @@
1
- .otp-wrapper[data-v-e8da3c38]{cursor:pointer;width:400px;max-width:100%;position:relative}.otp-box[data-v-e8da3c38]{width:100%;display:flex}.otp-item[data-v-e8da3c38]{border-bottom:1px solid #00000029;flex:1;justify-content:center;align-items:center;height:60px;transition:all .2s;display:flex}.otp-item.active[data-v-e8da3c38]{border-bottom:1px solid #000}.fade-enter-from[data-v-f6d3cf05],.fade-leave-to[data-v-f6d3cf05]{opacity:0}.popup-container[data-v-f6d3cf05]{transition:opacity var(--duration) ease-in-out;will-change:opacity;position:fixed}.popup-content[data-v-f6d3cf05]{transition:transform var(--duration) ease-in-out;will-change:transform;position:absolute}.popup-container-top .popup-content[data-v-f6d3cf05]{top:0;left:0;right:0}.fade-enter-from.popup-container-top .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-top .popup-content[data-v-f6d3cf05]{transform:translateY(-100%)}.popup-container-bottom .popup-content[data-v-f6d3cf05]{bottom:0;left:0;right:0}.fade-enter-from.popup-container-bottom .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-bottom .popup-content[data-v-f6d3cf05]{transform:translateY(100%)}.popup-container-left .popup-content[data-v-f6d3cf05]{top:0;bottom:0;left:0}.fade-enter-from.popup-container-left .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-left .popup-content[data-v-f6d3cf05]{transform:translate(-100%)}.popup-container-right .popup-content[data-v-f6d3cf05]{top:0;bottom:0;right:0}.fade-enter-from.popup-container-right .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-right .popup-content[data-v-f6d3cf05]{transform:translate(100%)}.popup-container-center .popup-content[data-v-f6d3cf05]{will-change:auto;transform-origin:50%;transition:none;top:50%;left:50%;transform:translate(-50%,-50%)}.button-container[data-v-f38282d0]{background-color:var(--bg);cursor:pointer;-webkit-user-select:none;user-select:none;transition-property:background-color,border-color;transition-duration:.3s;transition-timing-function:ease-in-out}.button-container[data-v-f38282d0]:focus{outline:none}.button-container.block[data-v-f38282d0]{width:100%;display:block}.button-container.disabled[data-v-f38282d0]{background-color:var(--disabled-bg);border-color:#0000!important}.collapse-content[data-v-cea8a740]{width:max-content}.collapse-enter-from[data-v-cea8a740],.collapse-leave-to[data-v-cea8a740]{max-height:0!important}.collapse-enter-active[data-v-cea8a740],.collapse-leave-active[data-v-cea8a740]{max-height:var(--max-height);transition:max-height var(--duration) ease-in-out;overflow:hidden}.input-box[data-v-f5f052a7]{will-change:border-color;box-sizing:border-box;border-bottom:1px solid #00000029;align-items:center;gap:16px;height:60px;padding:16px 0;transition:border-color .2s ease-in-out;display:flex}.input-box[data-v-f5f052a7]:focus-within{border-color:#000}.input-box input[data-v-f5f052a7]{width:100%;height:100%;font-size:inherit;border:none;outline:none}input[data-v-f5f052a7]::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-f5f052a7]::-moz-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-f5f052a7]:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}.input-box img[data-v-f5f052a7]{-o-object-fit:contain;object-fit:contain;cursor:pointer;width:24px;height:24px}:-webkit-any(input:-webkit-autofill,textarea:-webkit-autofill){-webkit-box-shadow:0 0 0 1000px var(--input-bg,#fff) inset;-webkit-text-fill-color:inherit}:is(input:autofill,textarea:autofill){-webkit-box-shadow:0 0 0 1000px var(--input-bg,#fff) inset;-webkit-text-fill-color:inherit}input:focus,textarea:focus,button:focus{outline:none}input::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}textarea::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input::-moz-placeholder{color:var(--input-placeholder-color,#999)}textarea::-moz-placeholder{color:var(--input-placeholder-color,#999)}input:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}
1
+ .otp-wrapper[data-v-e8da3c38]{cursor:pointer;width:400px;max-width:100%;position:relative}.otp-box[data-v-e8da3c38]{width:100%;display:flex}.otp-item[data-v-e8da3c38]{border-bottom:1px solid #00000029;flex:1;justify-content:center;align-items:center;height:60px;transition:all .2s;display:flex}.otp-item.active[data-v-e8da3c38]{border-bottom:1px solid #000}.fade-enter-from[data-v-f6d3cf05],.fade-leave-to[data-v-f6d3cf05]{opacity:0}.popup-container[data-v-f6d3cf05]{transition:opacity var(--duration) ease-in-out;will-change:opacity;position:fixed}.popup-content[data-v-f6d3cf05]{transition:transform var(--duration) ease-in-out;will-change:transform;position:absolute}.popup-container-top .popup-content[data-v-f6d3cf05]{top:0;left:0;right:0}.fade-enter-from.popup-container-top .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-top .popup-content[data-v-f6d3cf05]{transform:translateY(-100%)}.popup-container-bottom .popup-content[data-v-f6d3cf05]{bottom:0;left:0;right:0}.fade-enter-from.popup-container-bottom .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-bottom .popup-content[data-v-f6d3cf05]{transform:translateY(100%)}.popup-container-left .popup-content[data-v-f6d3cf05]{top:0;bottom:0;left:0}.fade-enter-from.popup-container-left .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-left .popup-content[data-v-f6d3cf05]{transform:translate(-100%)}.popup-container-right .popup-content[data-v-f6d3cf05]{top:0;bottom:0;right:0}.fade-enter-from.popup-container-right .popup-content[data-v-f6d3cf05],.fade-leave-to.popup-container-right .popup-content[data-v-f6d3cf05]{transform:translate(100%)}.popup-container-center .popup-content[data-v-f6d3cf05]{will-change:auto;transform-origin:50%;transition:none;top:50%;left:50%;transform:translate(-50%,-50%)}.button-container[data-v-f38282d0]{background-color:var(--bg);cursor:pointer;-webkit-user-select:none;user-select:none;transition-property:background-color,border-color;transition-duration:.3s;transition-timing-function:ease-in-out}.button-container[data-v-f38282d0]:focus{outline:none}.button-container.block[data-v-f38282d0]{width:100%;display:block}.button-container.disabled[data-v-f38282d0]{background-color:var(--disabled-bg);border-color:#0000!important}.collapse-content[data-v-cc071022]{width:max-content}.collapse-enter-from[data-v-cc071022],.collapse-leave-to[data-v-cc071022]{max-height:0!important}.collapse-enter-active[data-v-cc071022],.collapse-leave-active[data-v-cc071022]{max-height:var(--max-height);transition:max-height var(--duration) ease-in-out;overflow:hidden}.input-box[data-v-56cf72b9]{will-change:border-color;box-sizing:border-box;border-bottom:1px solid #00000029;align-items:center;gap:16px;height:60px;padding:16px 0;transition:border-color .2s ease-in-out;display:flex}.input-box[data-v-56cf72b9]:focus-within{border-color:#000}.input-box input[data-v-56cf72b9]{width:100%;height:100%;font-size:inherit;border:none;outline:none}input[data-v-56cf72b9]::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-56cf72b9]::-moz-placeholder{color:var(--input-placeholder-color,#999)}input[data-v-56cf72b9]:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}.input-box img[data-v-56cf72b9]{-o-object-fit:contain;object-fit:contain;cursor:pointer;width:24px;height:24px}.menu-box[data-v-fbfe58be]{display:inline-flex;position:relative}.default-box[data-v-fbfe58be]{box-sizing:border-box;border:1px solid #000;align-items:center;min-width:240px;min-height:30px;padding:8px 16px;display:flex}.fade-enter-from[data-v-fbfe58be],[data-v-fbfe58be] .fade-enter-from,.fade-leave-to[data-v-fbfe58be],[data-v-fbfe58be] .fade-leave-to{opacity:0}.fade-enter-active[data-v-fbfe58be],[data-v-fbfe58be] .fade-enter-active,.fade-leave-active[data-v-fbfe58be],[data-v-fbfe58be] .fade-leave-active{transition:opacity var(--duration) ease-in-out}.menu-list-box[data-v-fbfe58be]{z-index:99;box-sizing:border-box;width:100%;padding-top:8px;position:absolute;top:100%;left:0}.menu-item-box[data-v-fbfe58be]{gap:var(--gap);box-sizing:border-box;background-color:#fff;flex-direction:column;width:100%;padding:16px 0;display:flex;position:relative;box-shadow:0 0 16px #0000000f}[data-v-fbfe58be] .menu-item-inner{box-sizing:border-box;cursor:pointer;will-change:background-color;-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;width:100%;height:40px;padding:0 16px;transition:background-color .1s linear;display:flex}[data-v-fbfe58be] .menu-item-inner.active,[data-v-fbfe58be] .menu-item-inner:hover{background-color:#f8f9f9}[data-v-fbfe58be] .menu-label{text-overflow:ellipsis;white-space:nowrap;flex:1;overflow:hidden}[data-v-fbfe58be] .sub-menu-box{z-index:99;gap:var(--gap);box-sizing:border-box;background-color:#fff;border-left:1px solid #0000000f;flex-direction:column;padding:16px 8px;display:flex;position:absolute;top:0;left:100%;box-shadow:0 -16px 16px -16px #0000000f,16px 0 16px -16px #0000000f,0 16px 16px -16px #0000000f}[data-v-fbfe58be] .suffix-icon,[data-v-fbfe58be] .checked-icon{-o-object-fit:contain;object-fit:contain;width:18px;height:18px}:-webkit-any(input:-webkit-autofill,textarea:-webkit-autofill){-webkit-box-shadow:0 0 0 1000px var(--input-bg,#fff) inset;-webkit-text-fill-color:inherit}:is(input:autofill,textarea:autofill){-webkit-box-shadow:0 0 0 1000px var(--input-bg,#fff) inset;-webkit-text-fill-color:inherit}input:focus,textarea:focus,button:focus{outline:none}input::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}textarea::-webkit-input-placeholder{color:var(--input-placeholder-color,#999)}input::-moz-placeholder{color:var(--input-placeholder-color,#999)}textarea::-moz-placeholder{color:var(--input-placeholder-color,#999)}input:-ms-placeholder-shown{color:var(--input-placeholder-color,#999)}
2
2
  /*$vite$:1*/
@@ -8,3 +8,5 @@ export { default as Collapse } from './collapse';
8
8
  export type { RoxVCollapseProps } from './collapse';
9
9
  export { default as Input } from './input';
10
10
  export type { RoxVInputProps } from './input';
11
+ export { default as Menu } from './menu';
12
+ export type { RoxVMenuProps, RoxVMenuOptionProps } from './menu';
@@ -0,0 +1,5 @@
1
+ import { Plugin } from 'vue';
2
+ import { default as Menu } from './menu.vue';
3
+ export * from './types';
4
+ declare const _default: typeof Menu & Plugin;
5
+ export default _default;
@@ -0,0 +1,17 @@
1
+ import { RoxVMenuOptionProps, RoxVMenuProps } from './types';
2
+ type IProps = Pick<RoxVMenuProps, "checkedIcon" | "checkedIconClass" | "suffixIcon" | "suffixIconClass" | "itemContainerClass" | "itemGap" | "activeItemClass" | "subMenuContainerClass"> & {
3
+ deep: number;
4
+ item: RoxVMenuOptionProps;
5
+ parentValue: (string | number)[];
6
+ };
7
+ declare const model: import('vue').ModelRef<(string | number)[], string, (string | number)[], (string | number)[]>;
8
+ type __VLS_Props = IProps;
9
+ type __VLS_PublicProps = {
10
+ modelValue?: typeof model['value'];
11
+ } & __VLS_Props;
12
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
13
+ "update:modelValue": (value: (string | number)[]) => any;
14
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
15
+ "onUpdate:modelValue"?: ((value: (string | number)[]) => any) | undefined;
16
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
17
+ export default _default;
@@ -0,0 +1,39 @@
1
+ import { RoxVMenuOptionProps, RoxVMenuProps } from './types';
2
+ declare const model: import('vue').ModelRef<(string | number)[], string, (string | number)[], (string | number)[]>;
3
+ type __VLS_Props = RoxVMenuProps;
4
+ type __VLS_PublicProps = {
5
+ modelValue?: typeof model['value'];
6
+ } & __VLS_Props;
7
+ declare function __VLS_template(): {
8
+ attrs: Partial<{}>;
9
+ slots: {
10
+ default?(_: {}): any;
11
+ };
12
+ refs: {};
13
+ rootEl: HTMLDivElement;
14
+ };
15
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
16
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
17
+ open: (...args: any[]) => void;
18
+ close: (...args: any[]) => void;
19
+ "update:modelValue": (value: (string | number)[]) => void;
20
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
21
+ "onUpdate:modelValue"?: ((value: (string | number)[]) => any) | undefined;
22
+ onOpen?: ((...args: any[]) => any) | undefined;
23
+ onClose?: ((...args: any[]) => any) | undefined;
24
+ }>, {
25
+ activeItemClass: string;
26
+ duration: number;
27
+ itemGap: string;
28
+ subMenuContainerClass: string;
29
+ items: RoxVMenuOptionProps[];
30
+ listContainerClass: string;
31
+ defaultContainerClass: string;
32
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
33
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
34
+ export default _default;
35
+ type __VLS_WithTemplateSlots<T, S> = T & {
36
+ new (): {
37
+ $slots: S;
38
+ };
39
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,19 @@
1
+ export interface RoxVMenuOptionProps {
2
+ label: string;
3
+ value: string | number;
4
+ children?: RoxVMenuOptionProps[];
5
+ }
6
+ export interface RoxVMenuProps {
7
+ duration?: number;
8
+ items?: RoxVMenuOptionProps[];
9
+ suffixIcon?: string;
10
+ suffixIconClass?: string;
11
+ checkedIcon?: string;
12
+ checkedIconClass?: string;
13
+ listContainerClass?: string;
14
+ subMenuContainerClass?: string;
15
+ defaultContainerClass?: string;
16
+ itemContainerClass?: string;
17
+ itemGap?: string;
18
+ activeItemClass?: string;
19
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a-drowned-fish/rox-v",
3
- "version": "1.0.20",
3
+ "version": "1.0.21",
4
4
  "description": "vue ui library",
5
5
  "main": "dist/lib/index.js",
6
6
  "module": "dist/es/index.js",