jky-component-lib 0.0.10 → 0.0.17
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.
- package/dist/es/button/Button.vue.d.ts +6 -0
- package/dist/es/button/Button.vue.js +32 -4
- package/dist/es/button/style.css +144 -89
- package/dist/es/button-nav/ButtonNav.vue.d.ts +30 -0
- package/dist/es/button-nav/ButtonNav.vue.js +130 -0
- package/dist/es/button-nav/ButtonNav.vue3.js +5 -0
- package/dist/es/button-nav/index.d.ts +4 -0
- package/dist/es/button-nav/index.js +8 -0
- package/dist/es/button-nav/style.css +39 -0
- package/dist/es/components.d.ts +3 -0
- package/dist/es/components.js +10 -1
- package/dist/es/index.js +8 -2
- package/dist/es/menu/Menu.vue.d.ts +32 -0
- package/dist/es/menu/Menu.vue.js +110 -0
- package/dist/es/menu/Menu.vue3.js +5 -0
- package/dist/es/menu/index.d.ts +4 -0
- package/dist/es/menu/index.js +8 -0
- package/dist/es/menu/style.css +70 -0
- package/dist/es/package.json.js +1 -1
- package/dist/es/page-header/PageHeader.vue.d.ts +45 -0
- package/dist/es/page-header/PageHeader.vue.js +263 -0
- package/dist/es/page-header/PageHeader.vue3.js +5 -0
- package/dist/es/page-header/index.d.ts +4 -0
- package/dist/es/page-header/index.js +8 -0
- package/dist/es/page-header/style.css +140 -0
- package/dist/es/resolver.d.ts +1 -1
- package/dist/es/resolver.js +2 -2
- package/dist/es/say-hello/style.css +32 -8
- package/dist/es/style.css +531 -54
- package/dist/es/styles.css +1 -1
- package/dist/lib/button/Button.vue.d.ts +6 -0
- package/dist/lib/button/Button.vue.js +31 -3
- package/dist/lib/button/style.css +144 -89
- package/dist/lib/button-nav/ButtonNav.vue.d.ts +30 -0
- package/dist/lib/button-nav/ButtonNav.vue.js +130 -0
- package/dist/lib/button-nav/ButtonNav.vue3.js +5 -0
- package/dist/lib/button-nav/index.d.ts +4 -0
- package/dist/lib/button-nav/index.js +8 -0
- package/dist/lib/button-nav/style.css +39 -0
- package/dist/lib/components.d.ts +3 -0
- package/dist/lib/components.js +13 -4
- package/dist/lib/index.js +9 -3
- package/dist/lib/menu/Menu.vue.d.ts +32 -0
- package/dist/lib/menu/Menu.vue.js +110 -0
- package/dist/lib/menu/Menu.vue3.js +5 -0
- package/dist/lib/menu/index.d.ts +4 -0
- package/dist/lib/menu/index.js +8 -0
- package/dist/lib/menu/style.css +70 -0
- package/dist/lib/package.json.js +1 -1
- package/dist/lib/page-header/PageHeader.vue.d.ts +45 -0
- package/dist/lib/page-header/PageHeader.vue.js +263 -0
- package/dist/lib/page-header/PageHeader.vue3.js +5 -0
- package/dist/lib/page-header/index.d.ts +4 -0
- package/dist/lib/page-header/index.js +8 -0
- package/dist/lib/page-header/style.css +140 -0
- package/dist/lib/resolver.d.ts +1 -1
- package/dist/lib/resolver.js +2 -2
- package/dist/lib/say-hello/style.css +32 -8
- package/dist/lib/style.css +531 -54
- package/dist/lib/styles.css +1 -1
- package/dist/umd/index.js +1856 -14
- package/dist/umd/styles.css +1 -1
- package/package.json +6 -1
package/dist/es/styles.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.jky-button{align-items:center;border:1px solid
|
|
1
|
+
:root{--jky-button-primary-bg:#007bff;--jky-button-primary-text:#fff;--jky-button-primary-hover-bg:#0056b3;--jky-button-success-bg:#28a745;--jky-button-success-text:#fff;--jky-button-success-hover-bg:#1e7e34;--jky-button-warning-bg:#ffc107;--jky-button-warning-text:#fff;--jky-button-warning-hover-bg:#e0a800;--jky-button-danger-bg:#dc3545;--jky-button-danger-text:#fff;--jky-button-danger-hover-bg:#c82333;--jky-button-info-bg:#6c757d;--jky-button-info-text:#fff;--jky-button-info-hover-bg:#5a6268;--jky-button-default-bg:#fff;--jky-button-default-text:#606266;--jky-button-default-border:#dcdfe6;--jky-button-default-hover-bg:#f5f7fa;--jky-button-font-size:14px;--jky-button-font-size-small:12px;--jky-button-font-size-large:16px;--jky-button-padding:0 16px;--jky-button-padding-small:0 12px;--jky-button-padding-large:0 20px;--jky-button-height:40px;--jky-button-height-small:32px;--jky-button-height-large:48px;--jky-button-border-radius:0.375rem;--jky-button-disabled-opacity:0.5;--jky-button-disabled-bg:#f5f7fa;--jky-button-disabled-text:#c0c4cc;--jky-button-loading-opacity:0.7;--jky-button-icon-size:1.25rem;--jky-button-icon-margin:0.5rem}.jky-button{align-items:center;background-color:var(--jky-button-default-bg);border:1px solid var(--jky-button-default-border);border-radius:var(--jky-button-border-radius);color:var(--jky-button-default-text);cursor:pointer;display:inline-flex;font-size:var(--jky-button-font-size);font-weight:500;height:var(--jky-button-height);justify-content:center;padding:var(--jky-button-padding);transition:color .2s,background-color .2s}.jky-button--primary{background-color:var(--jky-button-primary-bg);border:none;color:var(--jky-button-primary-text)}.jky-button--primary:hover{background-color:var(--jky-button-primary-hover-bg)}.jky-button--success{background-color:var(--jky-button-success-bg);border:none;color:var(--jky-button-success-text)}.jky-button--success:hover{background-color:var(--jky-button-success-hover-bg)}.jky-button--warning{background-color:var(--jky-button-warning-bg);border:none;color:var(--jky-button-warning-text)}.jky-button--warning:hover{background-color:var(--jky-button-warning-hover-bg)}.jky-button--danger{background-color:var(--jky-button-danger-bg);border:none;color:var(--jky-button-danger-text)}.jky-button--danger:hover{background-color:var(--jky-button-danger-hover-bg)}.jky-button--info{background-color:var(--jky-button-info-bg);border:none;color:var(--jky-button-info-text)}.jky-button--info:hover{background-color:var(--jky-button-info-hover-bg)}.jky-button--small{font-size:var(--jky-button-font-size-small);height:var(--jky-button-height-small);padding:var(--jky-button-padding-small)}.jky-button--large{font-size:var(--jky-button-font-size-large);height:var(--jky-button-height-large);padding:var(--jky-button-padding-large)}.jky-button.is-disabled{background-color:var(--jky-button-disabled-bg);color:var(--jky-button-disabled-text);cursor:not-allowed;opacity:var(--jky-button-disabled-opacity);pointer-events:none}.jky-button.is-loading{opacity:var(--jky-button-loading-opacity);pointer-events:none;position:relative}.jky-button__loading{display:flex;inset:0;position:absolute}.jky-button__icon,.jky-button__loading{align-items:center;justify-content:center}.jky-button__icon{display:inline-flex;font-size:1em;margin-right:var(--jky-button-icon-margin)}.jky-button__icon:only-child{margin-right:0}.jky-button--suffix .jky-button__icon{margin-left:var(--jky-button-icon-margin);margin-right:0}.jky-button:focus-visible{box-shadow:0 0 0 2px #fff,0 0 0 4px #000;outline:2px solid transparent;outline-offset:2px}.loading-spinner{animation:spin 1s linear infinite;height:var(--jky-button-icon-size);width:var(--jky-button-icon-size)}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}:root{--jky-button-nav-active-bg:var(--el-color-primary);--jky-button-nav-active-text:#fff;--jky-button-nav-inactive-bg:var(--el-fill-color-light);--jky-button-nav-inactive-text:var(--el-text-color-regular);--el-dropdown-menu-margin-left:12px}.jky-button-nav{align-items:center;display:flex;flex-wrap:wrap;.el-dropdown{margin-left:var(--el-dropdown-menu-margin-left)}}.jky-button-nav-item{background-color:var(--jky-button-nav-inactive-bg);color:var(--jky-button-nav-inactive-text);&.is-active,&[aria-pressed=true]{background-color:var(--jky-button-nav-active-bg);color:var(--jky-button-nav-active-text)}}:root{--jky-menu-bg-color:#fff;--jky-menu-text-color:#303133;--jky-menu-active-color:#409eff;--jky-menu-hover-bg-color:#f5f7fa;--jky-menu-hover-text-color:#606266;--jky-menu-item-height:56px;--jky-menu-item-padding:0 20px;--jky-menu-item-font-size:14px;--jky-menu-icon-size:18px;--jky-menu-icon-margin:8px;--jky-menu-border-color:#e4e7ed;--jky-menu-disabled-opacity:0.5;--jky-menu-disabled-text-color:#c0c4cc}.jky-menu{background-color:var(--jky-menu-bg-color);color:var(--jky-menu-text-color)}.jky-menu{li+li{margin-top:0}}.jky-menu-item__icon{align-items:center;display:inline-flex;flex-shrink:0;font-size:var(--jky-menu-icon-size);height:var(--jky-menu-icon-size);justify-content:center;margin-right:var(--jky-menu-icon-margin);width:var(--jky-menu-icon-size)}.jky-menu-item__title{color:var(--jky-menu-text-color);flex:1;font-size:var(--jky-menu-item-font-size);line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jky-menu-item.is-disabled{color:var(--jky-menu-disabled-text-color);cursor:not-allowed;opacity:var(--jky-menu-disabled-opacity)}:root{--jky-page-header-bg-color:#1890ff;--jky-page-header-bg-size:cover;--jky-page-header-bg-position:center;--jky-page-header-box-shadow:0 2px 8px rgba(0,0,0,.15);--jky-page-header-padding-x:24px;--jky-page-header-padding-x-mobile:16px;--jky-page-header-gap:16px;--jky-page-header-gap-mobile:12px;--jky-page-header-gap-left:12px;--jky-page-header-gap-status:12px;--jky-page-header-gap-center:24px;--jky-page-header-gap-center-mobile:12px;--jky-page-header-title-color:#fff;--jky-page-header-title-size:20px;--jky-page-header-title-size-mobile:16px;--jky-page-header-title-weight:600;--jky-page-header-text-color:hsla(0,0%,100%,.85);--jky-page-header-text-size:14px;--jky-page-header-icon-color:#fff;--jky-page-header-icon-size:20px;--jky-page-header-icon-hover-opacity:0.8;--jky-page-header-logo-height:40px;--jky-page-header-avatar-size:32px}.jky-page-header{background-color:var(--jky-page-header-bg-color);background-position:var(--jky-page-header-bg-position);background-size:var(--jky-page-header-bg-size);box-shadow:var(--jky-page-header-box-shadow);width:100%}.jky-page-header__container{align-items:center;display:flex;height:100%;justify-content:space-between;margin:0 auto;max-width:100%;padding:0 var(--jky-page-header-padding-x)}.jky-page-header__left{align-items:center;display:flex;flex-shrink:0;gap:var(--jky-page-header-gap-left)}.jky-page-header__logo{height:var(--jky-page-header-logo-height);object-fit:contain;width:auto}.jky-page-header__title{color:var(--jky-page-header-title-color);font-size:var(--jky-page-header-title-size);font-weight:var(--jky-page-header-title-weight);white-space:nowrap}.jky-page-header__center{align-items:center;display:flex;flex:1;justify-content:center;margin:0 var(--jky-page-header-gap-center);min-width:0}.jky-page-header__right{align-items:center;display:flex;flex-shrink:0;gap:var(--jky-page-header-gap)}.jky-page-header__status-icons{align-items:center;display:flex;gap:var(--jky-page-header-gap-status)}.jky-page-header__status-icon{color:var(--jky-page-header-icon-color);cursor:pointer;transition:opacity .2s;&:hover{opacity:var(--jky-page-header-icon-hover-opacity)}}.jky-page-header__time{color:var(--jky-page-header-text-color);font-size:var(--jky-page-header-text-size);white-space:nowrap}.jky-page-header__user{align-items:center;color:var(--jky-page-header-text-color);cursor:pointer;display:flex;gap:8px}.jky-page-header__avatar{color:var(--jky-page-header-icon-color);img{height:100%;object-fit:cover;width:100%}}.jky-page-header__username{color:var(--jky-page-header-text-color);font-size:var(--jky-page-header-text-size);white-space:nowrap}@media (max-width:768px){.jky-page-header__container{padding:0 var(--jky-page-header-padding-x-mobile)}.jky-page-header__title{font-size:var(--jky-page-header-title-size-mobile)}.jky-page-header__center{margin:0 var(--jky-page-header-gap-center-mobile)}.jky-page-header__right{gap:var(--jky-page-header-gap-mobile)}}:root{--jky-say-hello-bg:#42b883;--jky-say-hello-text:#fff;--jky-say-hello-hover-bg:#3aa876;--jky-say-hello-font-size:16px;--jky-say-hello-padding:8px 20px;--jky-say-hello-margin:4px 2px;--jky-say-hello-border-radius:6px}.jky-say-hello{background-color:var(--jky-say-hello-bg);border-radius:var(--jky-say-hello-border-radius);color:var(--jky-say-hello-text);cursor:pointer;display:inline-block;font-size:var(--jky-say-hello-font-size);margin:var(--jky-say-hello-margin);padding:var(--jky-say-hello-padding);text-align:center;text-decoration:none;transition:background-color .2s ease}.jky-say-hello:hover{background-color:var(--jky-say-hello-hover-bg)}@import "tailwindcss";@plugin "@iconify/tailwind4";@custom-variant dark (&:is(.dark *))
|
|
@@ -3,10 +3,16 @@ type __VLS_Props = {
|
|
|
3
3
|
size?: 'large' | 'default' | 'small';
|
|
4
4
|
disabled?: boolean;
|
|
5
5
|
loading?: boolean;
|
|
6
|
+
icon?: string;
|
|
7
|
+
iconPosition?: 'prefix' | 'suffix';
|
|
6
8
|
};
|
|
7
9
|
declare function __VLS_template(): {
|
|
8
10
|
attrs: Partial<{}>;
|
|
9
11
|
slots: {
|
|
12
|
+
icon?(_: {}): any;
|
|
13
|
+
icon?(_: {}): any;
|
|
14
|
+
icon?(_: {}): any;
|
|
15
|
+
default?(_: {}): any;
|
|
10
16
|
default?(_: {}): any;
|
|
11
17
|
};
|
|
12
18
|
refs: {};
|
|
@@ -25,6 +25,14 @@ const _hoisted_2 = {
|
|
|
25
25
|
key: 0,
|
|
26
26
|
class: "jky-button__loading"
|
|
27
27
|
};
|
|
28
|
+
const _hoisted_3 = {
|
|
29
|
+
key: 0,
|
|
30
|
+
class: "jky-button__icon"
|
|
31
|
+
};
|
|
32
|
+
const _hoisted_4 = {
|
|
33
|
+
key: 1,
|
|
34
|
+
class: "jky-button__icon"
|
|
35
|
+
};
|
|
28
36
|
const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValues({}, {
|
|
29
37
|
name: "JkyButton"
|
|
30
38
|
}), {
|
|
@@ -33,7 +41,9 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
|
|
|
33
41
|
type: { default: "primary" },
|
|
34
42
|
size: { default: "default" },
|
|
35
43
|
disabled: { type: Boolean, default: false },
|
|
36
|
-
loading: { type: Boolean, default: false }
|
|
44
|
+
loading: { type: Boolean, default: false },
|
|
45
|
+
icon: {},
|
|
46
|
+
iconPosition: { default: "prefix" }
|
|
37
47
|
},
|
|
38
48
|
emits: ["click"],
|
|
39
49
|
setup(__props, { emit: __emit }) {
|
|
@@ -81,8 +91,26 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
|
|
|
81
91
|
})
|
|
82
92
|
])
|
|
83
93
|
], -1)
|
|
84
|
-
])])) : vue.
|
|
85
|
-
|
|
94
|
+
])])) : __props.icon ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
|
|
95
|
+
__props.iconPosition === "prefix" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3, [
|
|
96
|
+
vue.renderSlot(_ctx.$slots, "icon", {}, () => [
|
|
97
|
+
vue.createElementVNode("span", {
|
|
98
|
+
class: vue.normalizeClass(__props.icon)
|
|
99
|
+
}, null, 2)
|
|
100
|
+
])
|
|
101
|
+
])) : vue.createCommentVNode("", true),
|
|
102
|
+
vue.renderSlot(_ctx.$slots, "default"),
|
|
103
|
+
__props.iconPosition === "suffix" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4, [
|
|
104
|
+
vue.renderSlot(_ctx.$slots, "icon", {}, () => [
|
|
105
|
+
vue.createElementVNode("span", {
|
|
106
|
+
class: vue.normalizeClass(__props.icon)
|
|
107
|
+
}, null, 2)
|
|
108
|
+
])
|
|
109
|
+
])) : vue.createCommentVNode("", true)
|
|
110
|
+
], 64)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 2 }, [
|
|
111
|
+
vue.renderSlot(_ctx.$slots, "icon"),
|
|
112
|
+
vue.renderSlot(_ctx.$slots, "default")
|
|
113
|
+
], 64))
|
|
86
114
|
], 10, _hoisted_1);
|
|
87
115
|
};
|
|
88
116
|
}
|
|
@@ -1,38 +1,141 @@
|
|
|
1
1
|
|
|
2
2
|
/* 禁止使用 @apply,所有 TailwindCSS 工具类直接写在 class 中 */
|
|
3
3
|
/* 样式文件仅用于定义组件特定的自定义纯 CSS 样式 */
|
|
4
|
-
/* Button 组件样式 - 使用
|
|
4
|
+
/* Button 组件样式 - 使用 CSS 变量实现主题化 */
|
|
5
|
+
/* 1. 定义 CSS 变量 */
|
|
6
|
+
:root {
|
|
7
|
+
/* 颜色变量 */
|
|
8
|
+
--jky-button-primary-bg: #007bff;
|
|
9
|
+
--jky-button-primary-text: #ffffff;
|
|
10
|
+
--jky-button-primary-hover-bg: #0056b3;
|
|
11
|
+
|
|
12
|
+
--jky-button-success-bg: #28a745;
|
|
13
|
+
--jky-button-success-text: #ffffff;
|
|
14
|
+
--jky-button-success-hover-bg: #1e7e34;
|
|
15
|
+
|
|
16
|
+
--jky-button-warning-bg: #ffc107;
|
|
17
|
+
--jky-button-warning-text: #ffffff;
|
|
18
|
+
--jky-button-warning-hover-bg: #e0a800;
|
|
19
|
+
|
|
20
|
+
--jky-button-danger-bg: #dc3545;
|
|
21
|
+
--jky-button-danger-text: #ffffff;
|
|
22
|
+
--jky-button-danger-hover-bg: #c82333;
|
|
23
|
+
|
|
24
|
+
--jky-button-info-bg: #6c757d;
|
|
25
|
+
--jky-button-info-text: #ffffff;
|
|
26
|
+
--jky-button-info-hover-bg: #5a6268;
|
|
27
|
+
|
|
28
|
+
/* 默认样式 */
|
|
29
|
+
--jky-button-default-bg: #ffffff;
|
|
30
|
+
--jky-button-default-text: #606266;
|
|
31
|
+
--jky-button-default-border: #dcdfe6;
|
|
32
|
+
--jky-button-default-hover-bg: #f5f7fa;
|
|
33
|
+
|
|
34
|
+
/* 尺寸变量 */
|
|
35
|
+
--jky-button-font-size: 14px;
|
|
36
|
+
--jky-button-font-size-small: 12px;
|
|
37
|
+
--jky-button-font-size-large: 16px;
|
|
38
|
+
|
|
39
|
+
--jky-button-padding: 0 16px;
|
|
40
|
+
--jky-button-padding-small: 0 12px;
|
|
41
|
+
--jky-button-padding-large: 0 20px;
|
|
42
|
+
|
|
43
|
+
--jky-button-height: 40px;
|
|
44
|
+
--jky-button-height-small: 32px;
|
|
45
|
+
--jky-button-height-large: 48px;
|
|
46
|
+
|
|
47
|
+
/* 圆角 */
|
|
48
|
+
--jky-button-border-radius: 0.375rem;
|
|
49
|
+
|
|
50
|
+
/* 状态变量 */
|
|
51
|
+
--jky-button-disabled-opacity: 0.5;
|
|
52
|
+
--jky-button-disabled-bg: #f5f7fa;
|
|
53
|
+
--jky-button-disabled-text: #c0c4cc;
|
|
54
|
+
--jky-button-loading-opacity: 0.7;
|
|
55
|
+
|
|
56
|
+
/* 图标 */
|
|
57
|
+
--jky-button-icon-size: 1.25rem;
|
|
58
|
+
--jky-button-icon-margin: 0.5rem;
|
|
59
|
+
}
|
|
60
|
+
/* 2. 基础样式 */
|
|
5
61
|
.jky-button {
|
|
6
|
-
/* 基础样式 - 使用 TailwindCSS 工具类 */
|
|
7
62
|
display: inline-flex;
|
|
8
63
|
align-items: center;
|
|
9
64
|
justify-content: center;
|
|
65
|
+
height: var(--jky-button-height);
|
|
66
|
+
padding: var(--jky-button-padding);
|
|
67
|
+
font-size: var(--jky-button-font-size);
|
|
10
68
|
font-weight: 500;
|
|
11
|
-
border-radius:
|
|
69
|
+
border-radius: var(--jky-button-border-radius);
|
|
70
|
+
background-color: var(--jky-button-default-bg);
|
|
71
|
+
color: var(--jky-button-default-text);
|
|
72
|
+
border: 1px solid var(--jky-button-default-border);
|
|
12
73
|
transition: color 200ms, background-color 200ms;
|
|
13
74
|
cursor: pointer;
|
|
14
|
-
border: 1px solid transparent;
|
|
15
|
-
|
|
16
|
-
/* 默认尺寸 */
|
|
17
|
-
height: 40px;
|
|
18
|
-
padding: 0 16px;
|
|
19
|
-
font-size: 14px;
|
|
20
75
|
}
|
|
21
|
-
/*
|
|
22
|
-
.jky-button
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
76
|
+
/* 3. 类型变体 */
|
|
77
|
+
.jky-button--primary {
|
|
78
|
+
background-color: var(--jky-button-primary-bg);
|
|
79
|
+
color: var(--jky-button-primary-text);
|
|
80
|
+
border: none;
|
|
81
|
+
}
|
|
82
|
+
.jky-button--primary:hover {
|
|
83
|
+
background-color: var(--jky-button-primary-hover-bg);
|
|
84
|
+
}
|
|
85
|
+
.jky-button--success {
|
|
86
|
+
background-color: var(--jky-button-success-bg);
|
|
87
|
+
color: var(--jky-button-success-text);
|
|
88
|
+
border: none;
|
|
89
|
+
}
|
|
90
|
+
.jky-button--success:hover {
|
|
91
|
+
background-color: var(--jky-button-success-hover-bg);
|
|
92
|
+
}
|
|
93
|
+
.jky-button--warning {
|
|
94
|
+
background-color: var(--jky-button-warning-bg);
|
|
95
|
+
color: var(--jky-button-warning-text);
|
|
96
|
+
border: none;
|
|
97
|
+
}
|
|
98
|
+
.jky-button--warning:hover {
|
|
99
|
+
background-color: var(--jky-button-warning-hover-bg);
|
|
100
|
+
}
|
|
101
|
+
.jky-button--danger {
|
|
102
|
+
background-color: var(--jky-button-danger-bg);
|
|
103
|
+
color: var(--jky-button-danger-text);
|
|
104
|
+
border: none;
|
|
105
|
+
}
|
|
106
|
+
.jky-button--danger:hover {
|
|
107
|
+
background-color: var(--jky-button-danger-hover-bg);
|
|
108
|
+
}
|
|
109
|
+
.jky-button--info {
|
|
110
|
+
background-color: var(--jky-button-info-bg);
|
|
111
|
+
color: var(--jky-button-info-text);
|
|
112
|
+
border: none;
|
|
113
|
+
}
|
|
114
|
+
.jky-button--info:hover {
|
|
115
|
+
background-color: var(--jky-button-info-hover-bg);
|
|
116
|
+
}
|
|
117
|
+
/* 4. 尺寸变体 */
|
|
118
|
+
.jky-button--small {
|
|
119
|
+
height: var(--jky-button-height-small);
|
|
120
|
+
font-size: var(--jky-button-font-size-small);
|
|
121
|
+
padding: var(--jky-button-padding-small);
|
|
26
122
|
}
|
|
27
|
-
|
|
123
|
+
.jky-button--large {
|
|
124
|
+
height: var(--jky-button-height-large);
|
|
125
|
+
font-size: var(--jky-button-font-size-large);
|
|
126
|
+
padding: var(--jky-button-padding-large);
|
|
127
|
+
}
|
|
128
|
+
/* 5. 状态样式 */
|
|
28
129
|
.jky-button.is-disabled {
|
|
29
|
-
opacity:
|
|
130
|
+
opacity: var(--jky-button-disabled-opacity);
|
|
30
131
|
pointer-events: none;
|
|
31
132
|
cursor: not-allowed;
|
|
133
|
+
background-color: var(--jky-button-disabled-bg);
|
|
134
|
+
color: var(--jky-button-disabled-text);
|
|
32
135
|
}
|
|
33
|
-
/* 加载状态 */
|
|
34
136
|
.jky-button.is-loading {
|
|
35
137
|
position: relative;
|
|
138
|
+
opacity: var(--jky-button-loading-opacity);
|
|
36
139
|
pointer-events: none;
|
|
37
140
|
}
|
|
38
141
|
.jky-button__loading {
|
|
@@ -42,9 +145,31 @@
|
|
|
42
145
|
align-items: center;
|
|
43
146
|
justify-content: center;
|
|
44
147
|
}
|
|
148
|
+
/* 6. 图标样式 */
|
|
149
|
+
.jky-button__icon {
|
|
150
|
+
display: inline-flex;
|
|
151
|
+
align-items: center;
|
|
152
|
+
justify-content: center;
|
|
153
|
+
font-size: 1em;
|
|
154
|
+
margin-right: var(--jky-button-icon-margin);
|
|
155
|
+
}
|
|
156
|
+
.jky-button__icon:only-child {
|
|
157
|
+
margin-right: 0;
|
|
158
|
+
}
|
|
159
|
+
.jky-button--suffix .jky-button__icon {
|
|
160
|
+
margin-right: 0;
|
|
161
|
+
margin-left: var(--jky-button-icon-margin);
|
|
162
|
+
}
|
|
163
|
+
/* 7. 焦点样式 */
|
|
164
|
+
.jky-button:focus-visible {
|
|
165
|
+
outline: 2px solid transparent;
|
|
166
|
+
outline-offset: 2px;
|
|
167
|
+
box-shadow: 0 0 0 2px white, 0 0 0 4px #000;
|
|
168
|
+
}
|
|
169
|
+
/* 8. 加载动画 */
|
|
45
170
|
.loading-spinner {
|
|
46
|
-
width:
|
|
47
|
-
height:
|
|
171
|
+
width: var(--jky-button-icon-size);
|
|
172
|
+
height: var(--jky-button-icon-size);
|
|
48
173
|
animation: spin 1s linear infinite;
|
|
49
174
|
}
|
|
50
175
|
@keyframes spin {
|
|
@@ -55,73 +180,3 @@ to {
|
|
|
55
180
|
transform: rotate(360deg);
|
|
56
181
|
}
|
|
57
182
|
}
|
|
58
|
-
/* 按钮类型 */
|
|
59
|
-
.jky-button--primary {
|
|
60
|
-
background-color: #007bff;
|
|
61
|
-
color: #ffffff;
|
|
62
|
-
}
|
|
63
|
-
.jky-button--primary:hover {
|
|
64
|
-
background-color: #0056b3;
|
|
65
|
-
}
|
|
66
|
-
.jky-button--success {
|
|
67
|
-
background-color: #28a745;
|
|
68
|
-
color: #ffffff;
|
|
69
|
-
}
|
|
70
|
-
.jky-button--success:hover {
|
|
71
|
-
background-color: #1e7e34;
|
|
72
|
-
}
|
|
73
|
-
.jky-button--warning {
|
|
74
|
-
background-color: #ffc107;
|
|
75
|
-
color: #212529;
|
|
76
|
-
}
|
|
77
|
-
.jky-button--warning:hover {
|
|
78
|
-
background-color: #e0a800;
|
|
79
|
-
}
|
|
80
|
-
.jky-button--danger {
|
|
81
|
-
background-color: #dc3545;
|
|
82
|
-
color: #ffffff;
|
|
83
|
-
}
|
|
84
|
-
.jky-button--danger:hover {
|
|
85
|
-
background-color: #bd2130;
|
|
86
|
-
}
|
|
87
|
-
.jky-button--info {
|
|
88
|
-
background-color: #6c757d;
|
|
89
|
-
color: #ffffff;
|
|
90
|
-
}
|
|
91
|
-
.jky-button--info:hover {
|
|
92
|
-
background-color: #545b62;
|
|
93
|
-
}
|
|
94
|
-
/* 按钮尺寸 */
|
|
95
|
-
.jky-button--large {
|
|
96
|
-
height: 48px;
|
|
97
|
-
padding: 0 24px;
|
|
98
|
-
font-size: 16px;
|
|
99
|
-
}
|
|
100
|
-
.jky-button--default {
|
|
101
|
-
height: 40px;
|
|
102
|
-
padding: 0 16px;
|
|
103
|
-
font-size: 14px;
|
|
104
|
-
}
|
|
105
|
-
.jky-button--small {
|
|
106
|
-
height: 32px;
|
|
107
|
-
padding: 0 12px;
|
|
108
|
-
font-size: 12px;
|
|
109
|
-
}
|
|
110
|
-
/* 边框按钮样式 */
|
|
111
|
-
.jky-button--primary.is-border {
|
|
112
|
-
background-color: transparent;
|
|
113
|
-
border-color: #007bff;
|
|
114
|
-
color: #007bff;
|
|
115
|
-
}
|
|
116
|
-
.jky-button--primary.is-border:hover {
|
|
117
|
-
background-color: rgba(0, 123, 255, 0.1);
|
|
118
|
-
}
|
|
119
|
-
/* 文字按钮样式 */
|
|
120
|
-
.jky-button--text {
|
|
121
|
-
background-color: transparent;
|
|
122
|
-
color: #007bff;
|
|
123
|
-
border-color: transparent;
|
|
124
|
-
}
|
|
125
|
-
.jky-button--text:hover {
|
|
126
|
-
background-color: rgba(0, 123, 255, 0.1);
|
|
127
|
-
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ButtonProps } from 'element-plus/es/components/button';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
modelValue?: string | number;
|
|
4
|
+
items?: NavItem[];
|
|
5
|
+
limit?: number;
|
|
6
|
+
size?: ButtonProps['size'];
|
|
7
|
+
type?: ButtonProps['type'];
|
|
8
|
+
plain?: boolean;
|
|
9
|
+
buttonWidth?: string;
|
|
10
|
+
};
|
|
11
|
+
interface NavItem {
|
|
12
|
+
label: string;
|
|
13
|
+
value: string | number;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
icon?: string;
|
|
16
|
+
}
|
|
17
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {} & {
|
|
18
|
+
change: (value: string | number) => any;
|
|
19
|
+
"update:modelValue": (value: string | number) => any;
|
|
20
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
21
|
+
onChange?: ((value: string | number) => any) | undefined;
|
|
22
|
+
"onUpdate:modelValue"?: ((value: string | number) => any) | undefined;
|
|
23
|
+
}>, {
|
|
24
|
+
size: "" | "default" | "large" | "small";
|
|
25
|
+
type: "" | "default" | "primary" | "success" | "warning" | "danger" | "info" | "text";
|
|
26
|
+
items: NavItem[];
|
|
27
|
+
limit: number;
|
|
28
|
+
plain: boolean;
|
|
29
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
|
|
30
|
+
export default _default;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __defProps = Object.defineProperties;
|
|
4
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
5
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __spreadValues = (a, b) => {
|
|
10
|
+
for (var prop in b || (b = {}))
|
|
11
|
+
if (__hasOwnProp.call(b, prop))
|
|
12
|
+
__defNormalProp(a, prop, b[prop]);
|
|
13
|
+
if (__getOwnPropSymbols)
|
|
14
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
15
|
+
if (__propIsEnum.call(b, prop))
|
|
16
|
+
__defNormalProp(a, prop, b[prop]);
|
|
17
|
+
}
|
|
18
|
+
return a;
|
|
19
|
+
};
|
|
20
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
21
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
22
|
+
const vue = require("vue");
|
|
23
|
+
const ElementPlus = require("element-plus");
|
|
24
|
+
const _hoisted_1 = { class: "jky-button-nav flex flex-wrap items-center gap-2" };
|
|
25
|
+
const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValues({}, {
|
|
26
|
+
name: "JkyButtonNav"
|
|
27
|
+
}), {
|
|
28
|
+
__name: "ButtonNav",
|
|
29
|
+
props: {
|
|
30
|
+
modelValue: {},
|
|
31
|
+
items: { default: () => [] },
|
|
32
|
+
limit: { default: 2 },
|
|
33
|
+
size: { default: "default" },
|
|
34
|
+
type: { default: "primary" },
|
|
35
|
+
plain: { type: Boolean, default: false },
|
|
36
|
+
buttonWidth: {}
|
|
37
|
+
},
|
|
38
|
+
emits: ["update:modelValue", "change"],
|
|
39
|
+
setup(__props, { emit: __emit }) {
|
|
40
|
+
const props = __props;
|
|
41
|
+
const emit = __emit;
|
|
42
|
+
const visibleItems = vue.computed(() => props.items.slice(0, props.limit));
|
|
43
|
+
const hiddenItems = vue.computed(() => props.items.slice(props.limit));
|
|
44
|
+
const hasMore = vue.computed(() => props.items.length > props.limit);
|
|
45
|
+
function handleClick(value) {
|
|
46
|
+
emit("update:modelValue", value);
|
|
47
|
+
emit("change", value);
|
|
48
|
+
}
|
|
49
|
+
return (_ctx, _cache) => {
|
|
50
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
51
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleItems.value, (item) => {
|
|
52
|
+
return vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElButton), {
|
|
53
|
+
key: item.value,
|
|
54
|
+
type: props.modelValue === item.value ? props.type : "default",
|
|
55
|
+
size: props.size,
|
|
56
|
+
disabled: item.disabled,
|
|
57
|
+
link: props.plain && props.modelValue !== item.value,
|
|
58
|
+
style: vue.normalizeStyle({ width: props.buttonWidth }),
|
|
59
|
+
class: vue.normalizeClass({
|
|
60
|
+
"is-active": props.modelValue === item.value
|
|
61
|
+
}),
|
|
62
|
+
onClick: ($event) => handleClick(item.value)
|
|
63
|
+
}, vue.createSlots({
|
|
64
|
+
default: vue.withCtx(() => [
|
|
65
|
+
vue.createTextVNode(" " + vue.toDisplayString(item.label), 1)
|
|
66
|
+
]),
|
|
67
|
+
_: 2
|
|
68
|
+
}, [
|
|
69
|
+
item.icon ? {
|
|
70
|
+
name: "icon",
|
|
71
|
+
fn: vue.withCtx(() => [
|
|
72
|
+
vue.createElementVNode("span", {
|
|
73
|
+
class: vue.normalizeClass(item.icon)
|
|
74
|
+
}, null, 2)
|
|
75
|
+
]),
|
|
76
|
+
key: "0"
|
|
77
|
+
} : void 0
|
|
78
|
+
]), 1032, ["type", "size", "disabled", "link", "style", "class", "onClick"]);
|
|
79
|
+
}), 128)),
|
|
80
|
+
hasMore.value ? (vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElDropdown), {
|
|
81
|
+
key: 0,
|
|
82
|
+
trigger: "click"
|
|
83
|
+
}, {
|
|
84
|
+
dropdown: vue.withCtx(() => [
|
|
85
|
+
vue.createVNode(vue.unref(ElementPlus.ElDropdownMenu), { class: "jky-button-nav-dropdown" }, {
|
|
86
|
+
default: vue.withCtx(() => [
|
|
87
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(hiddenItems.value, (item) => {
|
|
88
|
+
return vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElDropdownItem), {
|
|
89
|
+
key: item.value,
|
|
90
|
+
disabled: item.disabled,
|
|
91
|
+
onClick: ($event) => handleClick(item.value)
|
|
92
|
+
}, {
|
|
93
|
+
default: vue.withCtx(() => [
|
|
94
|
+
item.icon ? (vue.openBlock(), vue.createElementBlock("span", {
|
|
95
|
+
key: 0,
|
|
96
|
+
class: vue.normalizeClass([item.icon, "mr-2"])
|
|
97
|
+
}, null, 2)) : vue.createCommentVNode("", true),
|
|
98
|
+
vue.createTextVNode(" " + vue.toDisplayString(item.label), 1)
|
|
99
|
+
]),
|
|
100
|
+
_: 2
|
|
101
|
+
}, 1032, ["disabled", "onClick"]);
|
|
102
|
+
}), 128))
|
|
103
|
+
]),
|
|
104
|
+
_: 1
|
|
105
|
+
})
|
|
106
|
+
]),
|
|
107
|
+
default: vue.withCtx(() => [
|
|
108
|
+
vue.createVNode(vue.unref(ElementPlus.ElButton), {
|
|
109
|
+
type: hiddenItems.value.some((item) => item.value === props.modelValue) ? props.type : "default",
|
|
110
|
+
size: props.size,
|
|
111
|
+
link: props.plain && !hiddenItems.value.some((item) => item.value === props.modelValue),
|
|
112
|
+
style: vue.normalizeStyle({ width: props.buttonWidth }),
|
|
113
|
+
class: vue.normalizeClass({
|
|
114
|
+
"is-active": hiddenItems.value.some((item) => item.value === props.modelValue)
|
|
115
|
+
})
|
|
116
|
+
}, {
|
|
117
|
+
default: vue.withCtx(() => [..._cache[0] || (_cache[0] = [
|
|
118
|
+
vue.createTextVNode(" 更多 ", -1),
|
|
119
|
+
vue.createElementVNode("span", { class: "ml-1" }, "▼", -1)
|
|
120
|
+
])]),
|
|
121
|
+
_: 1
|
|
122
|
+
}, 8, ["type", "size", "link", "style", "class"])
|
|
123
|
+
]),
|
|
124
|
+
_: 1
|
|
125
|
+
})) : vue.createCommentVNode("", true)
|
|
126
|
+
]);
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}));
|
|
130
|
+
exports.default = _sfc_main;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const ButtonNav_vue_vue_type_script_setup_true_lang = require("./ButtonNav.vue.js");
|
|
4
|
+
;/* empty css */
|
|
5
|
+
exports.default = ButtonNav_vue_vue_type_script_setup_true_lang.default;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const ButtonNav_vue_vue_type_script_setup_true_lang = require("./ButtonNav.vue.js");
|
|
4
|
+
;/* empty css */
|
|
5
|
+
const withInstall = require("../utils/with-install.js");
|
|
6
|
+
const JkyButtonNav = withInstall.installWithSFC(ButtonNav_vue_vue_type_script_setup_true_lang.default);
|
|
7
|
+
exports.JkyButtonNav = JkyButtonNav;
|
|
8
|
+
exports.default = JkyButtonNav;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/* ButtonNav 组件样式 */
|
|
2
|
+
:root {
|
|
3
|
+
/* 选中状态的颜色变量 */
|
|
4
|
+
--jky-button-nav-active-bg: var(--el-color-primary);
|
|
5
|
+
--jky-button-nav-active-text: #ffffff;
|
|
6
|
+
--jky-button-nav-inactive-bg: var(--el-fill-color-light);
|
|
7
|
+
--jky-button-nav-inactive-text: var(--el-text-color-regular);
|
|
8
|
+
|
|
9
|
+
/* Dropdown 间距 */
|
|
10
|
+
--el-dropdown-menu-margin-left: 12px;
|
|
11
|
+
}
|
|
12
|
+
.jky-button-nav {
|
|
13
|
+
/* 使用纯 CSS 定义容器样式 */
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-wrap: wrap;
|
|
16
|
+
align-items: center;
|
|
17
|
+
.el-dropdown {
|
|
18
|
+
margin-left: var(--el-dropdown-menu-margin-left);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* 按钮选中状态 - 通过 CSS 变量控制 */
|
|
23
|
+
.jky-button-nav-item {
|
|
24
|
+
/* 默认状态(未选中) */
|
|
25
|
+
background-color: var(--jky-button-nav-inactive-bg);
|
|
26
|
+
color: var(--jky-button-nav-inactive-text);
|
|
27
|
+
|
|
28
|
+
/* 选中状态 */
|
|
29
|
+
&[aria-pressed="true"],
|
|
30
|
+
&.is-active {
|
|
31
|
+
background-color: var(--jky-button-nav-active-bg);
|
|
32
|
+
color: var(--jky-button-nav-active-text);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* Dropdown 菜单保持 Element Plus 原始样式 */
|
|
37
|
+
.jky-button-nav-dropdown {
|
|
38
|
+
/* 不覆盖任何样式,保持 el-dropdown-menu 默认样式 */
|
|
39
|
+
}
|
package/dist/lib/components.d.ts
CHANGED
package/dist/lib/components.js
CHANGED
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const index = require("./button/index.js");
|
|
4
|
-
const index$1 = require("./
|
|
4
|
+
const index$1 = require("./button-nav/index.js");
|
|
5
|
+
const index$2 = require("./menu/index.js");
|
|
6
|
+
const index$3 = require("./page-header/index.js");
|
|
7
|
+
const index$4 = require("./say-hello/index.js");
|
|
5
8
|
const components = [
|
|
6
|
-
index$
|
|
7
|
-
index.JkyButton
|
|
9
|
+
index$4.JkySayHello,
|
|
10
|
+
index.JkyButton,
|
|
11
|
+
index$1.JkyButtonNav,
|
|
12
|
+
index$3.JkyPageHeader,
|
|
13
|
+
index$2.JkyMenu
|
|
8
14
|
];
|
|
9
15
|
exports.JkyButton = index.JkyButton;
|
|
10
|
-
exports.
|
|
16
|
+
exports.JkyButtonNav = index$1.JkyButtonNav;
|
|
17
|
+
exports.JkyMenu = index$2.JkyMenu;
|
|
18
|
+
exports.JkyPageHeader = index$3.JkyPageHeader;
|
|
19
|
+
exports.JkySayHello = index$4.JkySayHello;
|
|
11
20
|
exports.components = components;
|
package/dist/lib/index.js
CHANGED
|
@@ -5,14 +5,20 @@ const installer$1 = require("./utils/installer.js");
|
|
|
5
5
|
;/* empty css */
|
|
6
6
|
const resolver = require("./resolver.js");
|
|
7
7
|
const index = require("./button/index.js");
|
|
8
|
-
const index$1 = require("./
|
|
8
|
+
const index$1 = require("./button-nav/index.js");
|
|
9
|
+
const index$2 = require("./menu/index.js");
|
|
10
|
+
const index$3 = require("./page-header/index.js");
|
|
11
|
+
const index$4 = require("./say-hello/index.js");
|
|
9
12
|
const installer = installer$1.createInstaller(components.components);
|
|
10
13
|
const install = installer.install;
|
|
11
14
|
const version = installer.version;
|
|
12
15
|
exports.components = components.components;
|
|
13
|
-
exports.
|
|
16
|
+
exports.JkyComponentLibResolver = resolver.JkyComponentLibResolver;
|
|
14
17
|
exports.JkyButton = index.JkyButton;
|
|
15
|
-
exports.
|
|
18
|
+
exports.JkyButtonNav = index$1.JkyButtonNav;
|
|
19
|
+
exports.JkyMenu = index$2.JkyMenu;
|
|
20
|
+
exports.JkyPageHeader = index$3.JkyPageHeader;
|
|
21
|
+
exports.JkySayHello = index$4.JkySayHello;
|
|
16
22
|
exports.default = installer;
|
|
17
23
|
exports.install = install;
|
|
18
24
|
exports.version = version;
|