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.
Files changed (63) hide show
  1. package/dist/es/button/Button.vue.d.ts +6 -0
  2. package/dist/es/button/Button.vue.js +32 -4
  3. package/dist/es/button/style.css +144 -89
  4. package/dist/es/button-nav/ButtonNav.vue.d.ts +30 -0
  5. package/dist/es/button-nav/ButtonNav.vue.js +130 -0
  6. package/dist/es/button-nav/ButtonNav.vue3.js +5 -0
  7. package/dist/es/button-nav/index.d.ts +4 -0
  8. package/dist/es/button-nav/index.js +8 -0
  9. package/dist/es/button-nav/style.css +39 -0
  10. package/dist/es/components.d.ts +3 -0
  11. package/dist/es/components.js +10 -1
  12. package/dist/es/index.js +8 -2
  13. package/dist/es/menu/Menu.vue.d.ts +32 -0
  14. package/dist/es/menu/Menu.vue.js +110 -0
  15. package/dist/es/menu/Menu.vue3.js +5 -0
  16. package/dist/es/menu/index.d.ts +4 -0
  17. package/dist/es/menu/index.js +8 -0
  18. package/dist/es/menu/style.css +70 -0
  19. package/dist/es/package.json.js +1 -1
  20. package/dist/es/page-header/PageHeader.vue.d.ts +45 -0
  21. package/dist/es/page-header/PageHeader.vue.js +263 -0
  22. package/dist/es/page-header/PageHeader.vue3.js +5 -0
  23. package/dist/es/page-header/index.d.ts +4 -0
  24. package/dist/es/page-header/index.js +8 -0
  25. package/dist/es/page-header/style.css +140 -0
  26. package/dist/es/resolver.d.ts +1 -1
  27. package/dist/es/resolver.js +2 -2
  28. package/dist/es/say-hello/style.css +32 -8
  29. package/dist/es/style.css +531 -54
  30. package/dist/es/styles.css +1 -1
  31. package/dist/lib/button/Button.vue.d.ts +6 -0
  32. package/dist/lib/button/Button.vue.js +31 -3
  33. package/dist/lib/button/style.css +144 -89
  34. package/dist/lib/button-nav/ButtonNav.vue.d.ts +30 -0
  35. package/dist/lib/button-nav/ButtonNav.vue.js +130 -0
  36. package/dist/lib/button-nav/ButtonNav.vue3.js +5 -0
  37. package/dist/lib/button-nav/index.d.ts +4 -0
  38. package/dist/lib/button-nav/index.js +8 -0
  39. package/dist/lib/button-nav/style.css +39 -0
  40. package/dist/lib/components.d.ts +3 -0
  41. package/dist/lib/components.js +13 -4
  42. package/dist/lib/index.js +9 -3
  43. package/dist/lib/menu/Menu.vue.d.ts +32 -0
  44. package/dist/lib/menu/Menu.vue.js +110 -0
  45. package/dist/lib/menu/Menu.vue3.js +5 -0
  46. package/dist/lib/menu/index.d.ts +4 -0
  47. package/dist/lib/menu/index.js +8 -0
  48. package/dist/lib/menu/style.css +70 -0
  49. package/dist/lib/package.json.js +1 -1
  50. package/dist/lib/page-header/PageHeader.vue.d.ts +45 -0
  51. package/dist/lib/page-header/PageHeader.vue.js +263 -0
  52. package/dist/lib/page-header/PageHeader.vue3.js +5 -0
  53. package/dist/lib/page-header/index.d.ts +4 -0
  54. package/dist/lib/page-header/index.js +8 -0
  55. package/dist/lib/page-header/style.css +140 -0
  56. package/dist/lib/resolver.d.ts +1 -1
  57. package/dist/lib/resolver.js +2 -2
  58. package/dist/lib/say-hello/style.css +32 -8
  59. package/dist/lib/style.css +531 -54
  60. package/dist/lib/styles.css +1 -1
  61. package/dist/umd/index.js +1856 -14
  62. package/dist/umd/styles.css +1 -1
  63. package/package.json +6 -1
@@ -1 +1 @@
1
- .jky-button{align-items:center;border:1px solid transparent;border-radius:.375rem;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;height:40px;justify-content:center;padding:0 16px;transition:color .2s,background-color .2s}.jky-button:focus-visible{box-shadow:0 0 0 2px #fff,0 0 0 4px #000;outline:2px solid transparent;outline-offset:2px}.jky-button.is-disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.jky-button.is-loading{pointer-events:none;position:relative}.jky-button__loading{align-items:center;display:flex;inset:0;justify-content:center;position:absolute}.loading-spinner{animation:spin 1s linear infinite;height:1.25rem;width:1.25rem}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.jky-button--primary{background-color:#007bff;color:#fff}.jky-button--primary:hover{background-color:#0056b3}.jky-button--success{background-color:#28a745;color:#fff}.jky-button--success:hover{background-color:#1e7e34}.jky-button--warning{background-color:#ffc107;color:#212529}.jky-button--warning:hover{background-color:#e0a800}.jky-button--danger{background-color:#dc3545;color:#fff}.jky-button--danger:hover{background-color:#bd2130}.jky-button--info{background-color:#6c757d;color:#fff}.jky-button--info:hover{background-color:#545b62}.jky-button--large{font-size:16px;height:48px;padding:0 24px}.jky-button--default{font-size:14px;height:40px;padding:0 16px}.jky-button--small{font-size:12px;height:32px;padding:0 12px}.jky-button--primary.is-border{background-color:transparent;border-color:#007bff;color:#007bff}.jky-button--primary.is-border:hover{background-color:rgba(0,123,255,.1)}.jky-button--text{background-color:transparent;border-color:transparent;color:#007bff}.jky-button--text:hover{background-color:rgba(0,123,255,.1)}.jky-component-lib-say-hello{background:#42b883;border-radius:6px;color:#fff;cursor:pointer;display:inline-block;font-size:16px;margin:4px 2px;padding:8px 20px;text-align:center;text-decoration:none}@import "tailwindcss";@import "@fontsource-variable/geist";@custom-variant dark (&:is(.dark *))
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.createCommentVNode("", true),
85
- vue.renderSlot(_ctx.$slots, "default")
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 组件样式 - 使用 TailwindCSS 4.x */
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: 0.375rem;
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:focus-visible {
23
- outline: 2px solid transparent;
24
- outline-offset: 2px;
25
- box-shadow: 0 0 0 2px white, 0 0 0 4px #000;
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: 0.5;
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: 1.25rem;
47
- height: 1.25rem;
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,4 @@
1
+ import { InstallWithSFC } from '../utils';
2
+ import { default as ButtonNav } from './ButtonNav.vue';
3
+ export declare const JkyButtonNav: InstallWithSFC<typeof ButtonNav>;
4
+ export default JkyButtonNav;
@@ -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
+ }
@@ -1,5 +1,8 @@
1
1
  import { Plugin } from 'vue';
2
2
  export * from './button';
3
+ export * from './button-nav';
4
+ export * from './menu';
5
+ export * from './page-header';
3
6
  export * from './say-hello';
4
7
  export declare const components: Plugin[];
5
8
  export default components;
@@ -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("./say-hello/index.js");
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$1.JkySayHello,
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.JkySayHello = index$1.JkySayHello;
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("./say-hello/index.js");
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.StarterLibVue3Resolver = resolver.StarterLibVue3Resolver;
16
+ exports.JkyComponentLibResolver = resolver.JkyComponentLibResolver;
14
17
  exports.JkyButton = index.JkyButton;
15
- exports.JkySayHello = index$1.JkySayHello;
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;