element-like 0.0.0-stage → 0.1.0

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.
@@ -0,0 +1,2 @@
1
+ :root{--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-9:#f0f9eb;--el-color-success-light-8:#e1f3d8;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-9:#fdf6ec;--el-color-warning-light-8:#faecd8;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-9:#fef0f0;--el-color-danger-light-8:#fde2e2;--el-color-danger-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-9:#f4f4f5;--el-color-info-light-8:#e9e9eb;--el-color-info-dark-2:#73767a;--el-color-white:#fff;--el-color-black:#000;--el-bg-color:#fff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#fff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#fff;--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;--el-font-weight-primary:500;--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-menu-border-color:#e6e6e6;--el-menu-item-height:60px}body{font-family:var(--el-font-family);font-weight:400;font-size:var(--el-font-size-base);color:var(--el-text-color-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-tap-highlight-color:transparent;margin:0}a{color:var(--el-color-primary);text-decoration:none}a:hover,a:focus{color:var(--el-color-primary-light-3)}a:active{color:var(--el-color-primary-dark-2)}h1,h2,h3,h4,h5,h6{color:var(--el-text-color-regular);font-weight:inherit}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child,h6:last-child{margin-bottom:0}h1{font-size:calc(var(--el-font-size-base) + 6px)}h2{font-size:calc(var(--el-font-size-base) + 4px)}h3{font-size:calc(var(--el-font-size-base) + 2px)}h4,h5,h6,p{font-size:inherit}p{line-height:1.8}p:first-child{margin-top:0}p:last-child{margin-bottom:0}sup,sub{font-size:calc(var(--el-font-size-base) - 1px)}small{font-size:calc(var(--el-font-size-base) - 2px)}hr{border:0;border-top:1px solid var(--el-border-color-lighter);margin-top:20px;margin-bottom:20px}.el-like-icon{justify-content:center;align-items:center;display:inline-flex}.el-like-icon--primary{color:var(--el-color-primary)}.el-like-icon--success{color:var(--el-color-success)}.el-like-icon--warning{color:var(--el-color-warning)}.el-like-icon--danger{color:var(--el-color-danger)}.el-like-icon--info{color:var(--el-color-info)}.el-like-button{--el-button-text-color:var(--el-text-color-regular);--el-button-bg-color:var(--el-fill-color-blank);--el-button-border-color:var(--el-border-color);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-5);--el-button-active-text-color:var(--el-color-primary-dark-2);--el-button-active-bg-color:var(--el-color-primary-light-9);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-disabled-bg-color);--el-button-disabled-border-color:var(--el-disabled-border-color);--el-button-outline-color:var(--el-color-primary-light-5);box-sizing:border-box;border:var(--el-border);border-color:var(--el-button-border-color);border-radius:var(--el-border-radius-base);background-color:var(--el-button-bg-color);height:32px;color:var(--el-button-text-color);font-family:inherit;font-size:var(--el-font-size-base);font-weight:var(--el-font-weight-primary);white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;appearance:none;transition:color var(--el-transition-duration-fast), background-color var(--el-transition-duration-fast), border-color var(--el-transition-duration-fast);outline:none;justify-content:center;align-items:center;gap:6px;margin:0;padding:8px 15px;line-height:1;display:inline-flex}.el-like-button:not(:disabled):hover,.el-like-button:not(:disabled):focus-visible{border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);color:var(--el-button-hover-text-color)}.el-like-button:not(:disabled):active{border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);color:var(--el-button-active-text-color)}.el-like-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:2px}.el-like-button:disabled{border-color:var(--el-button-disabled-border-color);background-color:var(--el-button-disabled-bg-color);color:var(--el-button-disabled-text-color);cursor:not-allowed}.el-like-button__icon,.el-like-button__content{flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.el-like-button.is-round{border-radius:var(--el-border-radius-round)}.el-like-button.is-circle{border-radius:var(--el-border-radius-circle);width:32px;padding:8px}.el-like-button--default.is-plain{--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-active-bg-color:var(--el-fill-color-blank)}.el-like-button--large{height:40px;padding:12px 19px}.el-like-button--large.is-circle{width:40px;padding:12px}.el-like-button--small{height:24px;font-size:var(--el-font-size-extra-small);padding:5px 11px}.el-like-button--small.is-circle{width:24px;padding:5px}.el-like-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5);--el-button-outline-color:var(--el-color-primary-light-5)}.el-like-button--primary.is-plain{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-primary-light-5);--el-button-disabled-bg-color:var(--el-color-primary-light-9);--el-button-disabled-border-color:var(--el-color-primary-light-8)}.el-like-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5);--el-button-outline-color:var(--el-color-success-light-5)}.el-like-button--success.is-plain{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-success-light-5);--el-button-disabled-bg-color:var(--el-color-success-light-9);--el-button-disabled-border-color:var(--el-color-success-light-8)}.el-like-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5);--el-button-outline-color:var(--el-color-warning-light-5)}.el-like-button--warning.is-plain{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-warning-light-5);--el-button-disabled-bg-color:var(--el-color-warning-light-9);--el-button-disabled-border-color:var(--el-color-warning-light-8)}.el-like-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5);--el-button-outline-color:var(--el-color-danger-light-5)}.el-like-button--danger.is-plain{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-danger-light-5);--el-button-disabled-bg-color:var(--el-color-danger-light-9);--el-button-disabled-border-color:var(--el-color-danger-light-8)}.el-like-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5);--el-button-outline-color:var(--el-color-info-light-5)}.el-like-button--info.is-plain{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-info-light-5);--el-button-disabled-bg-color:var(--el-color-info-light-9);--el-button-disabled-border-color:var(--el-color-info-light-8)}.el-like-card{--el-card-bg-color:var(--el-bg-color);--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:var(--el-border-radius-base);--el-card-box-shadow:0 2px 12px 0 #0000001a;--el-card-padding:20px;box-sizing:border-box;border:var(--el-border-width) var(--el-border-style) var(--el-card-border-color);border-radius:var(--el-card-border-radius);background-color:var(--el-card-bg-color);box-shadow:var(--el-card-box-shadow);color:var(--el-text-color-regular);overflow:hidden}.el-like-card__image{object-fit:cover;width:100%;display:block}.el-like-card__summary,.el-like-card__footer{padding:14px var(--el-card-padding)}.el-like-card__summary{font-size:var(--el-font-size-base);overflow-wrap:anywhere;line-height:1.6}.el-like-card__footer{border-top:var(--el-border-width) var(--el-border-style) var(--el-card-border-color)}.el-like-collapse{--el-collapse-border-color:var(--el-border-color-light);--el-collapse-header-height:48px;--el-collapse-header-bg-color:var(--el-fill-color-blank);--el-collapse-header-text-color:var(--el-text-color-primary);--el-collapse-header-font-size:var(--el-font-size-medium);--el-collapse-content-bg-color:var(--el-fill-color-blank);--el-collapse-content-font-size:var(--el-font-size-base);--el-collapse-content-text-color:var(--el-text-color-regular);border-top:var(--el-border);border-bottom:var(--el-border)}.el-like-collapse-item:last-of-type{margin-bottom:-1px}.el-like-collapse-item__header{box-sizing:border-box;width:100%;height:var(--el-collapse-header-height);border:0;border-bottom:var(--el-border);background-color:var(--el-collapse-header-bg-color);color:var(--el-collapse-header-text-color);font-family:inherit;font-size:var(--el-collapse-header-font-size);font-weight:var(--el-font-weight-primary);text-align:left;cursor:pointer;-webkit-user-select:none;user-select:none;appearance:none;transition:color var(--el-transition-duration-fast), border-bottom-color var(--el-transition-duration);outline:none;align-items:center;padding:0 8px;line-height:1.4;display:flex}.el-like-collapse-item__header.is-active{border-bottom-color:#0000}.el-like-collapse-item__header:hover{color:var(--el-color-primary)}.el-like-collapse-item__header:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:-2px}.el-like-collapse-item__title{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.el-like-collapse-item__arrow{border-right:2px solid var(--el-collapse-header-text-color);border-bottom:2px solid var(--el-collapse-header-text-color);width:8px;height:8px;transition:transform var(--el-transition-duration);flex-shrink:0;margin:0 8px 0 auto;transform:rotate(-45deg)}.el-like-collapse-item__arrow.is-active{transform:rotate(45deg)}.el-like-collapse-item__wrap{transition:height var(--el-transition-duration) ease;overflow:hidden}.el-like-collapse-item__content{background-color:var(--el-collapse-content-bg-color);color:var(--el-collapse-content-text-color);font-size:var(--el-collapse-content-font-size);padding:16px;line-height:1.6}.el-like-collapse-item.is-disabled .el-like-collapse-item__header{color:var(--el-disabled-text-color);cursor:not-allowed}.el-like-collapse-item.is-disabled .el-like-collapse-item__header:hover{color:var(--el-disabled-text-color)}.el-like-dialog{--el-dialog-bg-color:var(--el-bg-color);--el-dialog-border-radius:var(--el-border-radius-base);--el-dialog-box-shadow:0 12px 32px 0 #0003;--el-dialog-padding:20px;box-sizing:border-box;border-radius:var(--el-dialog-border-radius);background-color:var(--el-dialog-bg-color);max-width:calc(100% - 32px);box-shadow:var(--el-dialog-box-shadow);color:var(--el-text-color-regular);margin-bottom:50px;margin-left:auto;margin-right:auto}.el-like-dialog__overlay{z-index:2000;background-color:#00000080;position:fixed;inset:0;overflow-y:auto}.el-like-dialog__header{padding:var(--el-dialog-padding) var(--el-dialog-padding) 12px;align-items:center;gap:16px;display:flex}.el-like-dialog__title{min-width:0;color:var(--el-text-color-primary);font-size:var(--el-font-size-large);flex:1;margin:0;line-height:1.4}.el-like-dialog__close{border-radius:var(--el-border-radius-base);width:32px;height:32px;color:var(--el-text-color-secondary);font:inherit;cursor:pointer;transition:color var(--el-transition-duration-fast), background-color var(--el-transition-duration-fast);background-color:#0000;border:0;flex-shrink:0;justify-content:center;align-items:center;padding:0;font-size:24px;line-height:1;display:inline-flex}.el-like-dialog__close:hover{background-color:var(--el-fill-color-light);color:var(--el-text-color-primary)}.el-like-dialog__close:focus-visible{outline:2px solid var(--el-color-primary);outline-offset:2px}.el-like-dialog__body{padding:8px var(--el-dialog-padding) var(--el-dialog-padding);font-size:var(--el-font-size-base);overflow-wrap:anywhere;line-height:1.6}.el-like-dialog__footer{padding:12px var(--el-dialog-padding) var(--el-dialog-padding)}.el-like-dialog-fade-enter-active,.el-like-dialog-fade-leave-active{transition:opacity var(--el-transition-duration)}.el-like-dialog-fade-enter-from,.el-like-dialog-fade-leave-to{opacity:0}.el-like-tooltip.el-like-dropdown{--el-tooltip-padding:0;--el-tooltip-bg-color:var(--el-bg-color-overlay);--el-tooltip-max-width:none;min-width:100px}.el-like-dropdown-menu{box-sizing:border-box;background-color:var(--el-bg-color-overlay);color:var(--el-text-color-regular);font-size:var(--el-font-size-base);margin:0;padding:5px 0;list-style:none}.el-like-dropdown-menu__item.is-divided{border-top:1px solid var(--el-border-color-lighter);margin-top:5px}.el-like-dropdown-menu__action{box-sizing:border-box;width:100%;color:inherit;font:inherit;white-space:nowrap;text-align:left;cursor:pointer;background:0 0;border:0;outline:none;align-items:center;gap:8px;padding:0 16px;line-height:36px;display:flex}.el-like-dropdown-menu__action:not(:disabled):hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-like-dropdown-menu__action:disabled{color:var(--el-text-color-disabled);cursor:not-allowed}.el-like-dropdown-menu__icon{flex-shrink:0}.el-like-dropdown-menu__label{text-overflow:ellipsis;overflow:hidden}.el-like-pager{--el-pager-active-color:var(--el-color-primary);--el-pager-active-bg-color:var(--el-color-primary-light-9);--el-pager-hover-text-color:var(--el-color-primary);--el-pager-hover-bg-color:var(--el-fill-color-light);--el-pager-button-size:32px;--el-pager-font-size:var(--el-font-size-base);max-width:100%;color:var(--el-text-color-regular);vertical-align:middle;display:inline-flex}.el-like-pager__list{flex-wrap:wrap;align-items:center;gap:4px;margin:0;padding:0;list-style:none;display:flex}.el-like-pager__item,.el-like-pager__button{justify-content:center;align-items:center;display:inline-flex}.el-like-pager__button{box-sizing:border-box;min-width:var(--el-pager-button-size);height:var(--el-pager-button-size);border-radius:var(--el-border-radius-base);color:inherit;font-family:inherit;font-size:var(--el-pager-font-size);white-space:nowrap;cursor:pointer;-webkit-user-select:none;user-select:none;appearance:none;transition:color var(--el-transition-duration-fast), background-color var(--el-transition-duration-fast);background-color:#0000;border:0;outline:none;margin:0;padding:0 6px;line-height:1}.el-like-pager__button:not(.is-active):hover{background-color:var(--el-pager-hover-bg-color);color:var(--el-pager-hover-text-color)}.el-like-pager__button:focus-visible{outline:2px solid var(--el-pager-active-color);outline-offset:2px}.el-like-pager__button.is-active{background-color:var(--el-pager-active-bg-color);color:var(--el-pager-active-color);font-weight:var(--el-font-weight-primary);cursor:default}.el-like-pager__ellipsis{color:var(--el-text-color-secondary);font-weight:var(--el-font-weight-primary)}.el-like-pager--large{--el-pager-button-size:40px;--el-pager-font-size:var(--el-font-size-medium)}.el-like-pager--small{--el-pager-button-size:24px;--el-pager-font-size:var(--el-font-size-extra-small)}.el-like-pager--primary{--el-pager-active-color:var(--el-color-primary);--el-pager-active-bg-color:var(--el-color-primary-light-9);--el-pager-hover-text-color:var(--el-color-primary)}.el-like-pager--success{--el-pager-active-color:var(--el-color-success);--el-pager-active-bg-color:var(--el-color-success-light-9);--el-pager-hover-text-color:var(--el-color-success)}.el-like-pager--warning{--el-pager-active-color:var(--el-color-warning);--el-pager-active-bg-color:var(--el-color-warning-light-9);--el-pager-hover-text-color:var(--el-color-warning)}.el-like-pager--danger{--el-pager-active-color:var(--el-color-danger);--el-pager-active-bg-color:var(--el-color-danger-light-9);--el-pager-hover-text-color:var(--el-color-danger)}.el-like-pager--info{--el-pager-active-color:var(--el-color-info);--el-pager-active-bg-color:var(--el-color-info-light-9);--el-pager-hover-text-color:var(--el-color-info)}.el-like-tooltip{--el-tooltip-bg-color:var(--el-text-color-primary);--el-tooltip-text-color:var(--el-color-white);--el-tooltip-font-size:var(--el-font-size-extra-small);--el-tooltip-padding:8px 12px;--el-tooltip-max-width:300px;--el-tooltip-border-radius:var(--el-border-radius-base);--el-tooltip-box-shadow:0 4px 12px 0 #0003;z-index:2010;box-sizing:border-box;max-width:var(--el-tooltip-max-width);padding:var(--el-tooltip-padding);border-radius:var(--el-tooltip-border-radius);background-color:var(--el-tooltip-bg-color);box-shadow:var(--el-tooltip-box-shadow);color:var(--el-tooltip-text-color);font-size:var(--el-tooltip-font-size);overflow-wrap:anywhere;line-height:1.4;position:fixed}.el-like-tooltip__arrow{background-color:var(--el-tooltip-bg-color);width:6px;height:6px;position:absolute}.el-like-tooltip__arrow.is-top{bottom:-3px;left:50%;transform:translate(-50%)rotate(45deg)}.el-like-tooltip__arrow.is-bottom{top:-3px;left:50%;transform:translate(-50%)rotate(45deg)}.el-like-tooltip__arrow.is-left{top:50%;right:-3px;transform:translateY(-50%)rotate(45deg)}.el-like-tooltip__arrow.is-right{top:50%;left:-3px;transform:translateY(-50%)rotate(45deg)}.el-like-tooltip__trigger{display:inline-flex}.el-like-tooltip-fade-enter-active,.el-like-tooltip-fade-leave-active{transition:opacity var(--el-transition-duration-fast)}.el-like-tooltip-fade-enter-from,.el-like-tooltip-fade-leave-to{opacity:0}
2
+ /*$vite$:1*/
@@ -0,0 +1,161 @@
1
+ # 组件库打包指南
2
+
3
+ 本文档描述 element-like 作为 npm 组件库的打包体系:产物结构、文件职责、依赖分层,以及日常维护(增删组件、调整依赖)时**必须同步修改的位置**。维护前请先通读「⚠️ 联动约定」。
4
+
5
+ ## 产物概览
6
+
7
+ 打包输出 **ES Module** 与 **UMD** 两种格式,分别面向两类使用方:
8
+
9
+ | 使用方 | 格式 | 产物 | 特点 |
10
+ | --- | --- | --- | --- |
11
+ | 现代构建工具(Vite/webpack/Rollup) | ES | `dist/es/element-like.js` | 对等依赖全部 external,产物 ~20 kB,支持按需导入 tree-shaking |
12
+ | CDN / `<script>` 直接引入 | UMD | `dist/umd/element-like.umd.cjs` | 除 vue 外全部打进产物(~1 MB,fontawesome 全量图标所致,属预期) |
13
+
14
+ 样式统一抽取为 `style.css`,随两种格式各产出一份;另提升一份到 `dist/` 根目录供「只引样式」场景使用(见下方目录树)。
15
+
16
+ ```text
17
+ dist/
18
+ ├── es/
19
+ │ ├── element-like.js # ES 包体
20
+ │ └── style.css # ES 样式
21
+ ├── umd/
22
+ │ ├── element-like.umd.cjs # UMD 包体(全局变量 ElementLike)
23
+ │ └── style.css # UMD 样式
24
+ └── style.css # ← move-style 脚本从 dist/es/style.css 复制而来
25
+ ```
26
+
27
+ ## 文件职责
28
+
29
+ | 文件 | 职责 |
30
+ | --- | --- |
31
+ | [src/bundle.ts](../src/bundle.ts) | 库统一入口:聚合全部组件与全局样式,导出 `install`(全量安装)+ 各组件具名导出(按需,PascalCase 命名对齐 Element Plus) |
32
+ | [src/bundle.d.ts](../src/bundle.d.ts) | 公共类型声明:与 bundle.ts 导出逐一对应,含 `declare module 'vue'` 的 GlobalComponents 增强(使用方模板标签获得 Volar 解析与提示) |
33
+ | [src/components/withInstall.ts](../src/components/withInstall.ts) | `withInstall` 装配函数:为组件附加 `install`(注册原始名 + 去连字符别名),全量与按需安装共用 |
34
+ | [src/components/\*/index.ts](../src/components/Button/index.ts) | 各组件按需安装入口:`app.use(ElLikeButton)` 单独注册;带内部图标依赖的组件在此补齐最小图标注册 |
35
+ | [vite.es.config.ts](../vite.es.config.ts) | ES 格式打包配置(`vite build --config` 指定,不影响演示应用的 [vite.config.ts](../vite.config.ts)) |
36
+ | [vite.umd.config.ts](../vite.umd.config.ts) | UMD 格式打包配置 |
37
+ | [scripts/move-style.mjs](../scripts/move-style.mjs) | 把 `dist/es/style.css` 复制到 `dist/style.css`(Node 原生实现,无第三方依赖) |
38
+ | [scripts/copy-types.mjs](../scripts/copy-types.mjs) | 把 `src/bundle.d.ts` 复制到 `dist/es` 与 `dist/umd`,供 `types` 字段与 exports 的 types 条件引用 |
39
+ | [package.json](../package.json) | 入口字段(`main`/`module`/`types`/`exports`)、`files`、依赖分层、`build:lib` 系列脚本 |
40
+
41
+ ```text
42
+ pnpm build:lib
43
+ = pnpm build-es (vite build --config vite.es.config.ts)
44
+ → pnpm build-umd (vite build --config vite.umd.config.ts)
45
+ → pnpm move-style (node scripts/move-style.mjs)
46
+ → pnpm copy-types (node scripts/copy-types.mjs)
47
+ ```
48
+
49
+ 注意与演示应用构建区分:**`pnpm build` 是演示应用构建**(类型检查 + vite build 示例页),**`pnpm build:lib` 才是库打包**。
50
+
51
+ ## 依赖分层
52
+
53
+ 同一份 package.json 既服务演示应用开发,又是发布包清单,三类依赖各司其职:
54
+
55
+ | 位置 | 内容 | 原因 |
56
+ | --- | --- | --- |
57
+ | `dependencies` | fontawesome 三件套 | 库运行时依赖(入口注册图标、Icon 组件渲染依赖)。放这里使用方 `npm install` 时自动装上 |
58
+ | `peerDependencies` | `vue` | 对等依赖:要求使用方自行安装 Vue,**发布时不会替使用方装**。ES 构建因此将 vue 标记 external,避免库内嵌一份 Vue 造成实例不一致 |
59
+ | `devDependencies` | `vue`、`vue-router`、构建/测试工具链 | 仅供本仓库的演示应用与开发流程使用。`vue` 同时出现在 devDependencies 是为本地开发与测试;`vue-router` 仅示例页路由用到,组件库本体不依赖 |
60
+
61
+ ## 维护操作
62
+
63
+ ### 新增组件(同步修改 5 处)
64
+
65
+ 1. **建按需安装入口**:新建 `src/components/Xxx/index.ts`,内容为 `export default /* @__PURE__ */ withInstall(Xxx)`——**PURE 注解不可省略**(原因见「按需安装机制」);组件内部若渲染图标(如 Button 的 loading),在 `setup` 里注册 `font-awesome-icon` 与所用图标(只注册内部用到的几个,保持 tree-shake)
66
+ 2. **登记入口**:[src/bundle.ts](../src/bundle.ts) 中
67
+ - `import ElLikeXxx from './components/Xxx'`(从 index.ts 导入,而非 .vue)
68
+ - 加入 `componentArr` 数组(决定 `app.use` 全量注册范围)
69
+ - 追加到末尾的按需导出列表 `export { ... }` 与默认导出对象
70
+ 3. **登记类型**:[src/bundle.d.ts](../src/bundle.d.ts) 中追加 `ElLikeXxx` 的导出声明、默认导出对象与 GlobalComponents 增强(三处)
71
+ 4. **确认组件名**:组件的 `defineOptions({ name: 'ElLike-Xxx' })` 必须存在——`install` 依赖 `component.name` 做全局注册(withInstall 有兜底守卫,未声明 name 的组件会被静默跳过,务必补齐)
72
+ 5. **登记样式**:组件样式若在 [src/styles/](../src/styles/) 体系内,需 `@use` 进 [src/styles/index.scss](../src/styles/index.scss)(这是库样式唯一入口,构建时抽取为 style.css)
73
+
74
+ ## 按需安装机制
75
+
76
+ 每个组件目录的 index.ts 用 [withInstall.ts](../src/components/withInstall.ts) 为组件装配 `install`(注册原始名 + 去连字符别名),使用方可 `import { ElLikeButton } from 'element-like'` 后 `app.use(ElLikeButton)` 单独注册;未用到的组件由构建工具 tree-shake 掉。
77
+
78
+ - **`/* @__PURE__ */` 注解是 tree-shake 的关键**:`withInstall` 是属性赋值调用,不加注解会被打包器视为有副作用而整体保留,连带打进全部组件与 fas 图标库(Button-only 产物体积 1.1MB → 159kB 的差别,已用消费测试项目的 `tree-shake.js` 入口实测验证)。
79
+ - **内部图标依赖最小注册**:Button 的 loading 依赖 spinner 图标,其 index.ts 的 setup 只注册 `faSpinner` + `font-awesome-icon`;Icon 的 install 注册全量 fas(图标名是运行时动态的,无法按名摇树)。**用户自定义图标名**(Button 的 icon、Dropdown 菜单项的 icon)需要使用方自行注册图标(`app.use(ElLikeIcon)` 或自行 `library.add`)。
80
+ - 全量安装(`app.use(ElementLike)`)逐个调用组件的 install,与按需安装走同一套逻辑,行为一致。
81
+
82
+ ## CDN 使用指南
83
+
84
+ 通过 `<script>` 直接引入 UMD 产物,无需构建工具。完整最小示例:
85
+
86
+ ```html
87
+ <!doctype html>
88
+ <html lang="zh-CN">
89
+ <head>
90
+ <meta charset="UTF-8" />
91
+ <!-- 样式必须手动引入:UMD 不会自动带样式 -->
92
+ <link rel="stylesheet" href="https://unpkg.com/element-like/dist/umd/style.css" />
93
+ </head>
94
+ <body>
95
+ <div id="app">
96
+ <el-like-button type="primary">按钮</el-like-button>
97
+ <el-like-icon icon="house"></el-like-icon>
98
+ </div>
99
+
100
+ <!-- 先挂 Vue 全局,再挂组件库(顺序不可颠倒) -->
101
+ <script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
102
+ <script src="https://unpkg.com/element-like/dist/umd/element-like.umd.cjs"></script>
103
+ <script>
104
+ const app = Vue.createApp({})
105
+ app.use(ElementLike) // 全量安装;UMD 的全局对象名为 ElementLike
106
+ app.mount('#app')
107
+ </script>
108
+ </body>
109
+ </html>
110
+ ```
111
+
112
+ ### 注意事项
113
+
114
+ - **标签必须全小写(kebab-case)**:浏览器 HTML 解析器会把标签强制小写,写 `<ElLike-Button>` 也会变成 `<el-like-button>`。解析链路与去连字符别名的来由见「已知坑位备忘」。
115
+ - **必须显式写闭合标签**:HTML 解析器不支持自定义元素的 `/>` 自闭合,`<el-like-icon icon="house" />` 会把后续内容吞进该元素内部,必须写成 `<el-like-icon icon="house"></el-like-icon>`。
116
+ - **引入顺序**:`vue.global.js` 必须在 `element-like.umd.cjs` 之前——UMD 产物把 vue 映射为全局变量 `Vue`,先加载组件库会直接报 `Vue is not defined`。
117
+ - **样式单独引入**:JS 与 CSS 是两份产物,`<link>` 指向 `dist/umd/style.css`(ES 用户则走包的 `element-like/style.css` 子路径)。
118
+ - **静态服务器需为 .cjs 提供 JS MIME**:常规静态服务器(如 `python -m http.server`)会把 .cjs 当作 octet-stream 返回,浏览器拒绝执行。真实 CDN(unpkg/jsdelivr)已处理;本地测试请用 `cdn-test/server.mjs`(见「本地验证设施」)。
119
+ - **生产版 Vue 静默失败**:`vue.global.prod.js` 剥离了「Failed to resolve component」等警告,组件名写错时表现为一个空壳自定义元素、控制台无任何报错。排查模板解析问题请临时换成 `vue.global.js`(开发版)。
120
+ - **体积预期**:UMD ~1 MB(gzip ~320 kB),因内含全量 solid 图标库,为 CDN 开箱即用有意为之。
121
+ - **部分注册**:除 `app.use(ElementLike)` 全量安装外,也可 `app.use(ElementLike.ElLikeButton)` 只注册单个组件(CDN 场景包体已固定,节省的是注册开销而非体积)。
122
+
123
+ ### 新增运行时依赖
124
+
125
+ - **库本体用到** → 放入 `dependencies`(fontawesome 同级),并在 [vite.es.config.ts](../vite.es.config.ts) 的 `rollupOptions.external` 中登记——ES 产物必须外置它
126
+ - **演示应用用到、库本体不用** → 放入 `devDependencies`
127
+ - **需要使用方自行安装** → 放入 `peerDependencies` 并 external
128
+ - UMD 侧策略不同:仅 vue external,其余全部打进产物(CDN 场景无模块解析能力,须开箱即用)。新增依赖会自动被 UMD 打进,无需登记
129
+
130
+ ## ⚠️ 联动约定(改一处必改它处)
131
+
132
+ | 改动 | 必须同步 |
133
+ | --- | --- |
134
+ | 改 `lib.fileName`(现为 `element-like`) | package.json 的 `main`/`module`/`exports` 中所有产物路径 |
135
+ | 改 `lib.cssFileName`(现固定为 `style`) | package.json `exports` 的 `./style.css` 路径 + `scripts/move-style.mjs` 中的源路径 |
136
+ | 移动/重命名 `src/bundle.ts` | 两份打包配置中的 `lib.entry` |
137
+ | 删除组件 | bundle.ts 三处登记同步移除;若删除后 styles 目录残留其 scss,需同步从 index.scss 摘除 |
138
+
139
+ ## 已知坑位备忘
140
+
141
+ - **Vite 8 lib 模式默认 CSS 产物名是 `<fileName>.css`**(即 `element-like.css`),不是历史版本的 `style.css`。因此两份配置里显式声明了 `cssFileName: 'style'`——删掉它会导致 move-style 失败、`./style.css` 导出路径失配。
142
+ - **`dist/style.css` 是脚本复制的产物**,不在任何 vite 构建的 outDir 内。手改它无效,源在 `dist/es/style.css`。
143
+ - **UMD ~1 MB 是刻意的**:`library.add(fas)` 全量注册 solid 图标(约 2k 个)。在意体积请走 ES 按需导入;不要试图在 UMD 里 external fontawesome(CDN 场景没有可靠全局变量可映射)。
144
+ - **组件注册名带连字符(`ElLike-Button`)与 DOM 模板不兼容**:浏览器会把 HTML 标签全小写化,Vue 对 `<el-like-button>` 的解析候选是小写/驼峰/首字母大写三种形式,均不含连字符。因此 [withInstall.ts](../src/components/withInstall.ts) 除原始名外**追加注册了去连字符别名**(`ElLikeButton`),SFC 与 CDN/DOM 两种消费方式均能命中。删除别名注册会破坏 CDN 场景(已用 `cdn-test/` 冒烟页验证)。
145
+ - **DOM 模板不支持自定义元素的 `/>` 自闭合**:HTML 解析器会把后续内容嵌套进该元素。CDN 使用方的模板必须显式写闭合标签(`<el-like-icon ...></el-like-icon>`)。
146
+ - **`pnpm link` 软连接联调会出现两份 Vue**:库产物把 vue 标记为 external,通过 `link:`/`pnpm link` 链接时 `import 'vue'` 沿库的真实路径解析到库自身的 node_modules,与使用方的 vue 形成两份副本,挂载时报 `Cannot read properties of null (reading 'ce')`。使用方构建配置加 `resolve.dedupe: ['vue']` 即可(见消费测试项目的 vite.config.js);从 registry / `file:` 安装时 pnpm 统一处理对等依赖,无此问题。
147
+ - `library` 是单例,入口重复 `library.add(fas)` 幂等,不会与使用方自己的图标注册冲突。
148
+ - 两种格式共用同一份 `publicDir: false`(组件库无静态资源,演示应用才有 public 目录)。
149
+
150
+ ## 本地验证设施
151
+
152
+ - **CDN 冒烟测试**(`cdn-test/`,不入库):`node cdn-test/server.mjs` 后访问 <http://localhost:5199/> —— 以 `<script>` 全局方式消费 UMD 产物,覆盖全部 9 个组件(含 Dialog 打开、Dropdown 展开),页面本身也是「CDN 使用指南」注意事项的活例子。修改打包产物后用它回归 CDN 链路。
153
+ - **软连接消费测试**(仓库外 `Desktop/element-like-consumer/`):`pnpm link ../element-like` 建立的消费方项目,走 `exports` 的 ESM 入口 + `style.css` 子路径,覆盖全量安装与按需导入两条路径。
154
+
155
+ ## 发布前检查清单
156
+
157
+ - [ ] `version` 已按语义化版本 bump(当前仓库默认保留开发版本号)
158
+ - [ ] `license` 字段已按发行意愿补充
159
+ - [ ] `pnpm build:lib` 通过,产物目录与上文一致
160
+ - [ ] `pnpm pack` 后用 `--dry-run` 或解包确认 `files: ["dist"]` 只发布产物
161
+ - [ ] 演示构建 `pnpm build` 与单测 `pnpm vitest run` 通过(打包改动不影响开发链路)
package/docs/usage.md ADDED
@@ -0,0 +1,164 @@
1
+ # element-like 使用指南
2
+
3
+ 面向**消费方**(使用本组件库的业务项目)的接入文档:从安装、样式引入,到全量/按需两种注册方式与图标使用。各组件的 props、插槽等 API 细节见对应组件目录的 README;打包体系与 CDN 直引见 [packaging.md](./packaging.md)。
4
+
5
+ ## 环境要求
6
+
7
+ - **Vue** `^3.5.0`(peerDependency,由使用方自行安装)
8
+ - **Node** `^22.18.0 || >=24.12.0`(包 engines 声明,低于此版本安装时会告警)
9
+ - 支持 ESM 的构建工具(Vite / webpack / Rollup);不经构建、以 `<script>` 直引的 CDN 场景见 [packaging.md 的 CDN 使用指南](./packaging.md#cdn-使用指南)
10
+
11
+ ## 安装
12
+
13
+ ### 从 registry 安装(正式发布后)
14
+
15
+ ```sh
16
+ pnpm add element-like
17
+ ```
18
+
19
+ ### 本地开发联调(未发布时)
20
+
21
+ 先在组件库仓库打出 dist 产物(消费方走的是 `package.json` exports 指向的 dist 文件,不打就引用不到):
22
+
23
+ ```sh
24
+ cd element-like && pnpm build:lib
25
+ ```
26
+
27
+ 再二选一接入:
28
+
29
+ ```sh
30
+ # 方式一:软链接(改库代码后重新 build:lib 即生效)
31
+ cd your-project && pnpm link ../element-like
32
+
33
+ # 方式二:file: 安装
34
+ pnpm add file:../element-like
35
+ ```
36
+
37
+ > **注意**:`pnpm link` 软链接方式下,库产物把 vue 标记为 external,`import 'vue'` 会沿库的真实路径解析到库自身的 node_modules,与使用方的 Vue 形成两份副本,挂载时报 `Cannot read properties of null (reading 'ce')`。使用方构建配置加一行即可解决:
38
+ >
39
+ > ```ts
40
+ > // vite.config.ts
41
+ > export default defineConfig({
42
+ > resolve: { dedupe: ['vue'] },
43
+ > })
44
+ > ```
45
+ >
46
+ > 从 registry / `file:` 安装时由包管理器统一处理对等依赖,无此问题。
47
+
48
+ ## 引入样式
49
+
50
+ JS 与 CSS 是两份独立产物。全部组件样式聚合在一个 `style.css`(约 25 kB / gzip 4 kB),按需注册同样整份引入,入口处引一次即可:
51
+
52
+ ```ts
53
+ import 'element-like/style.css'
54
+ ```
55
+
56
+ ## 全量注册(推荐,对齐 element-ui 的 `Vue.use(ElementUI)`)
57
+
58
+ ```ts
59
+ import { createApp } from 'vue'
60
+ import ElementLike from 'element-like'
61
+ import 'element-like/style.css'
62
+ import App from './App.vue'
63
+
64
+ const app = createApp(App)
65
+ app.use(ElementLike)
66
+ app.mount('#app')
67
+ ```
68
+
69
+ 模板中直接使用小写标签,无需 import 组件;图标库随全量注册一并就绪:
70
+
71
+ ```vue
72
+ <template>
73
+ <el-like-button type="primary" icon="paper-plane">发送</el-like-button>
74
+ <el-like-button type="success" icon="check">完成</el-like-button>
75
+ </template>
76
+ ```
77
+
78
+ ## 按需注册(对齐 element-plus,tree-shaking)
79
+
80
+ 具名导出为 PascalCase(对齐 Element Plus 的 `ElButton` 命名),`app.use` 单独注册,未用到的组件由构建工具 tree-shake 掉:
81
+
82
+ ```ts
83
+ import { ElLikeButton, ElLikeIcon } from 'element-like'
84
+ import 'element-like/style.css'
85
+
86
+ app.use(ElLikeButton)
87
+ app.use(ElLikeIcon)
88
+ ```
89
+
90
+ **模板写法与全量注册完全一致**——两种方式共用同一套 `withInstall` 装配,注册的组件名与别名相同,只是注册范围不同。默认导出同样携带全部组件,也可 `app.use(ElementLike.ElLikeButton)` 单独安装(CDN 场景的「部分注册」用法)。
91
+
92
+ 体积参考(本仓库 tree-shake 实测):只打包 Button 约 159 kB;连带全量 fas 图标约 1.1 MB;ES 库本体约 20 kB(gzip 6.3 kB)。
93
+
94
+ ### 导出名与模板标签对照
95
+
96
+ | 具名导出 | 模板标签 | 说明 |
97
+ | --- | --- | --- |
98
+ | `ElLikeIcon` | `<el-like-icon>` | 图标组件;install 附带注册全量 solid 图标库 |
99
+ | `ElLikeButton` | `<el-like-button>` | 按钮;install 附带注册 loading 所需 spinner 图标 |
100
+ | `ElLikeCard` | `<el-like-card>` | 卡片 |
101
+ | `ElLikeDialog` | `<el-like-dialog>` | 对话框 |
102
+ | `ElLikePager` | `<el-like-pager>` | 分页 |
103
+ | `ElLikeCollapse` | `<el-like-collapse>` | 折叠面板(配合 CollapseItem 使用) |
104
+ | `ElLikeCollapseItem` | `<el-like-collapse-item>` | 折叠面板项 |
105
+ | `ElLikeTooltip` | `<el-like-tooltip>` | 文字提示 |
106
+ | `ElLikeDropdown` | `<el-like-dropdown>` | 下拉菜单 |
107
+
108
+ 每个组件同时注册原始名(`ElLike-Button`)与去连字符别名(`ElLikeButton`),因此 SFC 模板里 `<ElLikeButton>` 与 `<el-like-button>` 两种写法均可用;DOM 模板(CDN 场景,浏览器会把标签小写化)只能写小写。注意多词组件的小写标签按单词断连字符:`<el-like-collapse-item>`(写成 `<el-like-collapseitem>` 解析不到注册名)。
109
+
110
+ ## 图标
111
+
112
+ 图标基于 font-awesome **solid** 图标集二次封装,业务侧只传图标名(不含 `fa-` 前缀):
113
+
114
+ ```vue
115
+ <el-like-button type="danger" icon="trash">删除</el-like-button>
116
+ <el-like-icon icon="house" />
117
+ ```
118
+
119
+ | 注册方式 | 可用图标 |
120
+ | --- | --- |
121
+ | 全量 `app.use(ElementLike)` | 全量 solid 图标(约 2k 个) |
122
+ | 按需 `app.use(ElLikeButton)` | 仅 spinner(loading 状态);`icon` 属性传入的图标名不生效 |
123
+ | 按需 `app.use(ElLikeButton)` + `app.use(ElLikeIcon)` | 全量 solid 图标 |
124
+
125
+ 原因:图标名是运行时动态值,无法按名摇树,所以 `ElLikeIcon` 的 install 一次性注册全量 fas;`ElLikeButton` 的 install 只注册自己内部用到的 spinner,保住按需体积。**按需场景下 Button 的 `icon` 属性要工作,必须同时注册 `ElLikeIcon`**(或使用方自行 `library.add` 所需图标)。
126
+
127
+ ## TypeScript
128
+
129
+ 包内置类型声明(`dist/es/bundle.d.ts`,由 `types` 字段与 exports 的 `types` 条件导出),无需额外安装 `@types/*`:
130
+
131
+ - `import { ElLikeButton } from 'element-like'` 获得组件类型(含 `install`),`app.use` 类型安全;
132
+ - 声明文件包含 `GlobalComponents` 增强,模板中的 `<el-like-button>` 等标签获得 Volar 的组件解析、props 提示与跳转。
133
+
134
+ ## 常见问题
135
+
136
+ ### 按需引入后按钮图标不显示
137
+
138
+ `ElLikeButton` 的 install 只注册 spinner(loading 用),`icon` 属性传入的图标名未注册。补注册 `ElLikeIcon`:
139
+
140
+ ```ts
141
+ import { ElLikeButton, ElLikeIcon } from 'element-like'
142
+ app.use(ElLikeButton)
143
+ app.use(ElLikeIcon)
144
+ ```
145
+
146
+ 控制台若同时出现 `Could not find one or more icon(s)`,原因相同。
147
+
148
+ ### 控制台出现 `Component "font-awesome-icon" has already been registered`
149
+
150
+ 旧产物在全量注册或 Button + Icon 组合按需时,两个 install 重复注册全局图标组件触发 Vue 告警。现版本的 install 已加「先查后挂」守卫,重新 `pnpm build:lib` 或升级到最新产物即可。
151
+
152
+ ### pnpm link 联调时报 `Cannot read properties of null (reading 'ce')`
153
+
154
+ 软链接导致两份 Vue 副本,见上文「本地开发联调」的 `resolve.dedupe: ['vue']` 配置。
155
+
156
+ ### 模板里组件名写错时没有任何报错
157
+
158
+ 生产版 Vue 会静默失败,渲染成一个空壳自定义元素。排查时换开发版 Vue,或对照上文导出名/标签表检查注册范围。
159
+
160
+ ## 相关文档
161
+
162
+ - 各组件用法与 API:`src/components/*/README.md`
163
+ - 打包体系、CDN 使用指南、新增组件维护约定:[packaging.md](./packaging.md)
164
+ - 组件列表与开发约定:仓库根目录 [README.md](../README.md)
package/package.json CHANGED
@@ -1,6 +1,97 @@
1
1
  {
2
2
  "name": "element-like",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "A Vue 3 components library with Element-style UI components",
5
+ "type": "module",
6
+ "keywords": [
7
+ "vue3",
8
+ "components",
9
+ "library",
10
+ "element-like"
11
+ ],
12
+ "license": "MIT",
13
+ "homepage": "https://github.com/bingquan040601/element-like",
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "git+https://github.com/bingquan040601/element-like.git"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "docs"
21
+ ],
22
+ "main": "./dist/umd/element-like.umd.cjs",
23
+ "module": "./dist/es/element-like.js",
24
+ "types": "./dist/es/bundle.d.ts",
25
+ "exports": {
26
+ ".": {
27
+ "types": "./dist/es/bundle.d.ts",
28
+ "import": "./dist/es/element-like.js",
29
+ "require": "./dist/umd/element-like.umd.cjs"
30
+ },
31
+ "./style.css": {
32
+ "import": "./dist/style.css",
33
+ "require": "./dist/umd/style.css"
34
+ }
35
+ },
36
+ "sideEffects": [
37
+ "**/*.css",
38
+ "**/*.scss"
39
+ ],
40
+ "scripts": {
41
+ "dev": "vite",
42
+ "build": "run-p type-check \"build-only {@}\" --",
43
+ "build:lib": "pnpm build-es && pnpm build-umd && pnpm move-style && pnpm copy-types",
44
+ "build-es": "vite build --config vite.es.config.ts",
45
+ "build-umd": "vite build --config vite.umd.config.ts",
46
+ "move-style": "node scripts/move-style.mjs",
47
+ "copy-types": "node scripts/copy-types.mjs",
48
+ "preview": "vite preview",
49
+ "test:unit": "vitest",
50
+ "build-only": "vite build",
51
+ "type-check": "vue-tsc --build",
52
+ "lint": "run-s \"lint:*\"",
53
+ "lint:oxlint": "oxlint . --fix",
54
+ "lint:eslint": "eslint . --fix --cache",
55
+ "format": "prettier --write --experimental-cli src/"
56
+ },
57
+ "dependencies": {
58
+ "@fortawesome/fontawesome-svg-core": "^7.3.1",
59
+ "@fortawesome/free-solid-svg-icons": "^7.3.1",
60
+ "@fortawesome/vue-fontawesome": "^3.3.3"
61
+ },
62
+ "peerDependencies": {
63
+ "vue": "^3.5.0"
64
+ },
65
+ "devDependencies": {
66
+ "@tsconfig/node24": "^24.0.5",
67
+ "@types/jsdom": "^30.0.0",
68
+ "@types/node": "^24.13.4",
69
+ "@vitejs/plugin-vue": "^6.0.8",
70
+ "@vitejs/plugin-vue-jsx": "^5.1.6",
71
+ "@vitest/eslint-plugin": "^1.6.27",
72
+ "@vue/eslint-config-typescript": "^14.9.0",
73
+ "@vue/test-utils": "^2.5.0",
74
+ "@vue/tsconfig": "^0.9.1",
75
+ "eslint": "^10.10.0",
76
+ "eslint-config-prettier": "^10.1.8",
77
+ "eslint-plugin-oxlint": "~1.82.0",
78
+ "eslint-plugin-vue": "~10.11.0",
79
+ "jiti": "^2.7.0",
80
+ "jsdom": "^30.0.1",
81
+ "npm-run-all2": "^9.0.3",
82
+ "oxlint": "~1.82.0",
83
+ "prettier": "3.9.6",
84
+ "sass-embedded": "^1.105.1",
85
+ "typescript": "~6.0.0",
86
+ "vite": "^8.2.2",
87
+ "vite-plugin-vue-devtools": "^8.2.1",
88
+ "vitest": "^4.1.11",
89
+ "vue": "^3.5.42",
90
+ "vue-eslint-parser": "^10.4.1",
91
+ "vue-router": "^5.3.1",
92
+ "vue-tsc": "^3.3.11"
93
+ },
94
+ "engines": {
95
+ "node": "^22.18.0 || >=24.12.0"
96
+ }
97
+ }