Anyon e634118a22 refactor(plugin): 迁移 v8 插件化组件体系
将 v6 中直接放在本地 app 的后台与微信能力迁移为 v8 插件组件,并把运行时基础能力沉淀到独立插件包。

主要内容:

- 新增 think-library、system、worker、static、install 等基础插件包。

- 新增 account、payment、wechat-client、wechat-service、wemall、wuma 等业务插件包。

- 移除 v6 的 app/admin 与 app/wechat 本地应用实现,改由插件分发接管。

- 将 Helper 能力彻底并入 System,统一为 plugin\system\helper\* 命名空间。

- 同步插件迁移发布清单与根 route 占位,保证安装发布流程可复现。
2026-05-08 15:30:46 +08:00

3429 lines
60 KiB
Plaintext

@charset "UTF-8";
@import "_config.less";
// +----------------------------------------------------------------------
// 标准化短工具类
// ma/mt/mr/mb/ml/mx/my
// pa/pt/pr/pb/pl/px/py
// ba/bt/br/bb/bl/b0
@nums: 0, 5, 10, 15, 20, 25, 30, 40;
each({
margin: ma m;
padding: pa p;
}, .(@value,@prop) {
@all: extract(@value, 1);
@base: extract(@value, 2);
each(@nums, .(@n) {
.@{all}@{n} {
@{prop}: @n * 1px !important;
}
.@{base}t@{n} {
@{prop}-top: @n * 1px !important;
}
.@{base}r@{n} {
@{prop}-right: @n * 1px !important;
}
.@{base}b@{n} {
@{prop}-bottom: @n * 1px !important;
}
.@{base}l@{n} {
@{prop}-left: @n * 1px !important;
}
.@{base}x@{n} {
@{prop}-left: @n * 1px !important;
@{prop}-right: @n * 1px !important;
}
.@{base}y@{n} {
@{prop}-top: @n * 1px !important;
@{prop}-bottom: @n * 1px !important;
}
});
});
.flex {
#flex();
each(range(5), {
&-@{value} {
flex: @value;
}
});
&-x {
#flex();
#flexDirection(row);
height: 100%;
&-center {
#flex();
height: 100%;
#flexAlign(center);
}
}
&-y {
#flex();
#flexDirection(column);
width: 100%;
&-center {
#flex();
width: 100%;
#flexJustify(center);
}
}
&-center {
#flex();
#flexAlign(center);
#flexJustify(center);
}
&-between {
#flex();
justify-content: space-between;
}
&-inline {
display: inline-flex;
}
&-wrap {
#flexWrap(wrap);
&-no {
#flexWrap(nowrap);
}
&-rev {
#flexWrap(wrap-reverse);
}
}
// 主轴方向
&-direction- {
&row {
#flexDirection(row);
&reverse {
#flexDirection(row-reverse);
}
}
&column {
#flexDirection(column);
&-reverse {
#flexDirection(column-reverse);
}
}
}
// 垂直方向
&-align- {
&start {
#flex();
#flexAlign(flex-start);
}
&end {
#flex();
#flexAlign(flex-end);
}
&center {
#flex();
#flexAlign(center);
}
}
// 横向布局
&-justify- {
&start {
#flex();
#flexJustify(flex-start);
}
&center {
#flex();
#flexJustify(center);
}
&end {
#flex();
#flexJustify(flex-end);
}
&space- {
&around {
#flexJustify(space-around);
}
&between {
#flexJustify(space-between);
}
&evenly {
#flexJustify(space-evenly);
}
}
}
}
.fixed {
position: fixed !important;
}
.absolute {
position: absolute !important;
&-full {
top: 0;
left: 0;
right: 0;
bottom: 0;
position: absolute;
}
}
.relative {
position: relative !important;
}
.headimg {
width: 33px;
height: 33px;
display: inline-block;
margin-right: 5px;
border-radius: 50%;
#imageBgCover();
&-no {
border: none;
box-shadow: none;
border-radius: 2px;
}
&-ss {
width: 20px;
height: 20px;
}
&-xs {
width: 25px;
height: 25px;
}
&-sm {
width: 40px;
height: 40px;
}
&-md {
width: 55px;
height: 55px;
}
&-lg {
width: 82px;
height: 82px;
}
> img {
width: 110%;
height: 110%;
max-width: 110%;
max-height: 110%;
margin: -5% 0 0 -5%;
}
& + * {
vertical-align: middle;
}
}
.notdata {
padding: 15px;
display: block;
font-size: 13px;
text-align: center;
line-height: 22px;
border-radius: @BoxBorderRadius;
letter-spacing: 1px;
background-color: #f2f2f2;
border: 1px solid @InputBorderNormalColor;
}
.notselect {
#notSelect();
}
.transition {
#defaTransition();
}
.overhide {
overflow: hidden !important;
}
.overauto {
overflow: auto !important;
}
.pointer {
cursor: pointer !important;
}
.nowrap {
white-space: nowrap !important;
}
.shadow {
box-shadow: @ShadowOuterMax;
}
.shadow-none {
box-shadow: none !important;
}
.shadow-mini {
box-shadow: @ShadowOuterMax;
}
.shadow-inset {
box-shadow: @ShadowInset;
}
.block {
display: block !important;
}
.inline-block {
display: inline-block !important;
}
.help-block {
color: var(--ta-text-muted, #999);
font-size: 12px;
margin-top: 4px;
line-height: 1.5;
}
.help-label {
display: block;
color: var(--ta-text-muted, #999) !important;
font-size: 12px;
text-align: left;
margin-bottom: 4px;
line-height: 1.6;
b {
color: var(--ta-accent, #090) !important;
font-size: 14px;
margin-right: 5px !important;
}
}
.help-checks:not(td) {
padding: 5px 0 5px 5px;
min-height: unset;
line-height: 34px;
border-radius: @BoxBorderRadius;
#flex();
#flexWrap(wrap);
&.layui-input {
padding: 1px 0 1px 5px;
}
}
.help-images:not(td) {
padding: 10px 0 0 10px !important;
min-height: unset;
border-radius: @BoxBorderRadius;
#flex();
#flexWrap(wrap);
.uploadimage {
margin: 0 10px 10px 0;
}
}
// 标准化后台说明块、缩进分隔线和操作区,减少模板中的重复内联样式。
.ta-note {
margin: 0 0 16px;
padding: 10px 12px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.8;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-left: 3px solid var(--ta-accent, #009688);
border-radius: 4px;
background: var(--ta-surface, #fff);
box-shadow: none;
p {
margin: 0;
}
p + p {
margin-top: 6px;
}
strong {
color: var(--ta-text-color, #1f2937);
font-weight: 700;
}
&--indent {
margin-left: 40px;
}
}
.ta-divider--indent {
margin-left: 40px;
}
.ta-actions {
text-align: center;
&--indent {
padding-left: 40px;
}
}
.ta-desc {
margin-top: 14px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.8;
p {
margin: 0;
}
p + p {
margin-top: 6px;
}
b {
color: var(--ta-text-color, #1f2937);
font-weight: 600;
}
}
.ta-kv {
display: grid;
gap: 8px;
margin-top: 12px;
&-item {
padding: 8px 10px;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 4px;
background: #fafafa;
}
&-label {
display: block;
margin-bottom: 4px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.4;
}
&-value {
display: block;
color: var(--ta-text-color, #1f2937);
font-size: 13px;
line-height: 1.7;
font-weight: 600;
word-break: break-all;
}
}
.think-box-shadow > fieldset {
margin: 0 0 12px;
padding: 10px 12px 12px;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 4px;
background: var(--ta-surface, #fff);
box-shadow: none;
> legend {
margin-left: 4px;
padding: 0 8px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.4;
font-weight: 600;
}
}
.layui-form.layui-card {
.layui-form-item.block.relative {
margin-bottom: 8px;
}
.layui-input,
.layui-textarea,
.layui-select,
.layui-form-select .layui-input {
padding-left: 10px;
padding-right: 10px;
}
.layui-input {
height: 34px;
line-height: 34px;
}
.layui-textarea {
min-height: 96px;
padding-top: 8px;
padding-bottom: 8px;
line-height: 1.7;
}
}
/* 搜索表单样式 */
.form-search {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
.layui-btn {
height: 32px;
padding: 0 10px;
font-size: 13px;
line-height: 32px;
.layui-icon {
font-size: 15px;
}
}
.layui-form-item {
&:last-child {
border: none;
}
position: relative;
white-space: nowrap;
margin-right: 0;
margin-bottom: 0;
border: 1px solid var(--ta-border-color, @InputBorderNormalColor);
border-radius: 6px;
overflow: visible;
background: var(--ta-surface, #fff);
box-shadow: none;
.layui-form-label {
width: auto !important;
border: none;
height: 30px;
padding: 0 8px;
line-height: 32px;
border-top-left-radius: 18px;
border-bottom-left-radius: 18px;
border-right: 1px solid var(--ta-border-color, @InputBorderNormalColor);
}
.layui-input-inline {
width: 150px;
margin: 0 !important;
display: inline-block !important;
overflow: visible;
input,
select {
width: 100%;
height: 30px;
padding: 0 8px;
line-height: 32px;
border-width: 0;
}
}
.layui-form-select {
display: block;
width: 100%;
dl {
top: 31px;
padding: 0;
border-width: 0;
z-index: 10;
box-shadow: var(--ta-shadow-sm, @ShadowOuterMax);
border-top-left-radius: 0;
border-top-right-radius: 0;
}
}
}
.layui-form-item:last-child {
background: transparent;
border: none;
}
.layui-form-item:last-child .layui-btn {
height: 34px;
padding: 0 16px;
border-radius: 6px;
}
& + .layui-table {
margin-top: 0 !important;
}
}
/* 自定义表格行高 */
table[data-line] + div tbody {
.layui-table-cell {
line-height: 21px;
padding-top: 10px;
padding-bottom: 2px;
.headimg.pull-left {
margin-top: 4px;
}
&.laytable-cell-checkbox {
line-height: 44px;
}
.layui-btn {
margin-top: 6px;
}
}
}
table[data-line="1"] + div tbody .layui-table-cell {
height: 44px;
&.laytable-cell-checkbox {
line-height: 24px;
}
}
table[data-line="2"] + div tbody .layui-table-cell {
height: 60px;
.layui-badge-middle {
line-height: 16px;
}
&.laytable-cell-checkbox {
line-height: 40px;
}
}
table[data-line="3"] + div tbody .layui-table-cell {
height: 80px;
.layui-badge-middle {
line-height: 17px;
}
&.laytable-cell-checkbox {
line-height: 60px;
}
}
.layui-table-tips .layui-table-tips-main {
font-size: 12px;
padding-top: 10px;
line-height: 21px;
.headimg.pull-left {
margin-top: 4px;
}
}
/* 表单验证异常提示 */
.label-required {
&-prev:before {
color: red;
width: 0.5em;
content: "*";
margin: -2px 0 0 -0.55em;
display: inline-block;
position: absolute;
font-size: 14px;
text-align: left;
font-weight: bold;
line-height: 1.6em;
}
&:after,
&-next:after {
top: 6px;
right: 5px;
color: red;
content: "*";
position: absolute;
margin-left: 4px;
font-weight: 700;
line-height: 1.8em;
}
&-null:before {
content: none !important;
}
}
/** 手机盒子及微信菜单 */
.mobile-preview {
width: 317px;
height: 580px;
position: relative;
background: url(../img/wechat/mobile_head.png) no-repeat 0 0;
border-radius: @BoxBorderRadius;
.mobile-header {
color: #fff;
width: auto;
margin: 0 30px;
overflow: hidden;
font-size: 15px;
padding-top: 30px;
text-align: center;
white-space: nowrap;
text-overflow: ellipsis;
word-wrap: normal;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
pointer-events: none;
-webkit-pointer-events: none;
}
.mobile-body {
top: 60px;
left: 0;
right: 0;
bottom: 0;
position: absolute;
background: #f5f5f5;
border: 1px solid #666;
border-radius: 0 0 @BoxBorderRadius @BoxBorderRadius;
iframe {
width: 100%;
height: 100%;
border: none;
}
}
.mobile-footer {
left: 1px;
right: 1px;
bottom: 1px;
position: absolute;
padding-left: 44px;
border-top: 1px solid rgb(208, 208, 208);
background: url(../img/wechat/mobile_foot.png) no-repeat 0 0;
border-radius: 0 0 @BoxBorderRadius @BoxBorderRadius;
li {
float: left;
width: 33.33%;
position: relative;
text-align: center;
line-height: 50px;
a {
width: auto;
color: #616161;
display: block;
overflow: hidden;
word-wrap: normal;
white-space: nowrap;
text-overflow: ellipsis;
text-decoration: none;
span:after {
content: "";
display: inline-block;
}
&:after {
top: -1px;
left: 0;
right: 0;
bottom: 0;
border: 1px solid rgb(208, 208, 208);
margin: 0 0 0 -1px;
z-index: 10;
content: "";
display: block;
position: absolute;
}
&.active:after {
border: 1px solid #44b549;
box-shadow: 0 0 3px #44b549;
z-index: 11;
}
&:hover {
background: rgba(0, 0, 0, 0.02);
}
}
> .close {
top: 1px;
right: 1px;
width: 18px;
height: 18px;
display: none;
cursor: pointer;
position: absolute;
z-index: 13;
text-align: center;
line-height: 18px;
}
&:hover > .close {
display: inline-block;
background: none !important;
&:hover {
color: #c33 !important;
}
}
}
.icon {
&-add,
&-sub {
display: inline-block;
vertical-align: middle;
&::before {
content: none;
}
}
&-add {
width: 14px;
height: 14px;
background: url(../img/wechat/index.png) 0 0 no-repeat;
}
&-sub {
width: 7px;
height: 7px;
margin-right: 2px;
background: url(../img/wechat/index.png) 0 -3pc no-repeat;
}
}
.sub-menu {
width: 100%;
bottom: 60px;
display: block;
position: absolute;
margin-bottom: -1px;
background-color: #fafafa;
ul li {
width: 100%;
padding: 0;
> .close {
top: 0;
}
a:after {
margin: -1px 0 1px 0;
}
}
}
.arrow {
left: 50%;
position: absolute;
margin-left: -6px;
}
.arrow_in,
.arrow_out {
width: 0;
height: 0;
z-index: 10;
border: 6px dashed transparent;
display: inline-block;
border-top-style: solid;
border-bottom-width: 0;
}
.arrow_in {
bottom: -4px;
z-index: 11;
border-top-color: #fafafa;
}
.arrow_out {
bottom: -5px;
z-index: 10;
border-top-color: #d0d0d0;
}
}
}
/*! 重置 Iframe 页面样式 */
.iframe-pagination {
padding: 20px;
&:not(.not-footer):after {
content: "";
height: 30px;
display: block;
}
.pagination-container {
left: 0;
right: 0;
bottom: 0;
padding: 5px 20px;
position: fixed;
background: #fff;
border-top: 1px solid #ddd;
}
}
.think-elips {
each(range(5), {
&-@{value} {
display: -webkit-box;
overflow: hidden;
line-height: 1.4em;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
line-clamp: @value;
-webkit-line-clamp: @value;
}
});
}
.think-box-shadow {
padding: 20px !important;
background: var(--ta-surface, #fff) !important;
box-shadow: none;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 4px;
> .layui-card {
box-shadow: none;
}
}
.think-box-notify {
display: block;
padding: 12px 14px;
position: relative;
overflow: hidden;
font-size: 13px;
background: var(--ta-surface, #fff);
line-height: 1.4em;
margin-bottom: 10px;
box-shadow: none;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 6px;
&[type] {
border-left: 4px solid #16baaa;
}
&[type="info"] {
border-left: 4px solid #31bdec;
}
&[type="error"] {
border-left: 4px solid #ff5722;
}
&[type="success"] {
border-left: 4px solid #16b777;
}
> b {
font-size: 15px;
}
> .layui-card {
box-shadow: none;
}
}
.think-page-loader {
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 1999;
position: fixed;
text-align: center;
background-color: var(--ta-body-bg, @LoadBackColor);
.loader {
top: 50%;
width: 50px;
height: 50px;
margin: -35px 0 0 -35px;
z-index: 999999;
display: inline-block;
position: fixed;
background-color: var(--ta-body-bg, @LoadBackColor);
}
.loader:before {
top: 59px;
left: 0;
width: 50px;
height: 7px;
opacity: 0.1;
content: "";
position: absolute;
border-radius: 50%;
background-color: #000;
animation: shadow 0.5s linear infinite;
}
.loader:after {
top: 0;
left: 0;
width: 50px;
height: 50px;
content: "";
position: absolute;
border-radius: 3px;
background-color: var(--ta-accent, #5fb878);
animation: loading 0.5s linear infinite;
}
}
.ta-shell-page {
padding: 20px;
}
.ta-shell-card {
box-shadow: none;
}
.ta-shell-card-body {
padding: 24px 20px;
}
.ta-full-body {
top: 0 !important;
left: 0 !important;
padding: 0;
background: var(--ta-body-bg, #f8fafc) !important;
}
.input-right-icon {
top: 1px;
right: 1px;
color: var(--ta-accent, #098);
width: 36px;
height: 36px;
display: inline-block;
position: absolute;
background: var(--ta-surface-soft, #e9e9e9);
text-align: center;
line-height: 38px;
&:hover {
color: var(--ta-accent, #009080);
background: var(--ta-accent-soft, #e0e0e0);
}
}
[data-tips-image] {
cursor: zoom-in !important;
}
[data-lazy-src] {
#imageBgCover();
}
.pace-inactive {
display: none;
}
.pace-progress {
top: 0;
right: 100%;
width: 100%;
height: 2px;
z-index: 2000;
position: fixed;
background: var(--ta-accent, #22df80);
}
input:not(.layui-hide, [type="hidden"]) {
&,
& + span {
+ .uploadimage {
margin-top: 5px;
}
}
}
.uploadimage {
width: 76px;
height: 76px;
cursor: pointer;
display: inline-block;
border-radius: 3px;
#imageBgCover();
#defaTransition();
background-image: url("../img/upimg.png");
box-shadow: @ShadowOuterMin;
&.uploadvideo {
background-color: #223;
background-image: url("../img/upvideo.png");
}
> span:first-child {
left: 50%;
height: 20px;
bottom: 4px;
z-index: 3;
display: none;
position: absolute;
margin-left: -33px;
box-shadow: @ShadowOuterMin;
.layui-icon {
color: #fff;
width: 22px;
float: left;
height: 20px;
text-align: center;
line-height: 22px;
background: rgba(0, 0, 0, 0.75);
}
.layui-icon:first-child {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
.layui-icon:last-child {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
}
&:hover > span:first-child {
display: block;
}
> span[data-file] {
width: 100%;
height: 100%;
display: block;
position: absolute;
z-index: 2;
}
}
.uploadimagemtl {
margin-right: 10px;
> div {
top: 4px;
left: 50%;
display: none;
position: absolute;
white-space: nowrap;
margin-left: -33px;
a {
color: #eee;
width: 22px;
height: 20px;
display: inline-block;
box-shadow: @ShadowOuterMin;
text-align: center;
line-height: 20px;
background: rgba(0, 0, 0, 0.8);
&:first-child {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
&:last-child {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
}
}
&:hover > div {
cursor: pointer;
display: inline-block;
a:hover {
color: #fff;
text-decoration: none;
}
}
}
.upload-image-smbox,
.upload-image-mdbox,
.upload-image-lgbox {
.uploadimage {
margin-bottom: 10px;
a {
width: 30px;
height: 30px;
line-height: 30px;
}
}
}
.upload-image-smbox .uploadimage {
width: 120px;
height: 120px;
}
.upload-image-mdbox .uploadimage {
width: 180px;
height: 180px;
}
.upload-image-lgbox .uploadimage {
width: 240px;
height: 240px;
}
button.layui-btn:not([type="button"]) {
overflow: hidden;
position: relative;
&::before {
content: "";
position: absolute;
}
&::after {
filter: alpha(opacity=0);
opacity: 0;
content: "\e63d";
position: absolute;
}
&.submit-button-loading {
cursor: pointer;
&::before {
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.1);
}
&::after {
left: 50%;
filter: alpha(opacity=100);
opacity: 1;
margin-left: -8px;
#iconLayout(15px);
content: "\e63d";
animation-name: layui-rotate;
-webkit-animation-name: layui-rotate;
-webkit-animation-duration: 1s;
animation-duration: 1s;
animation-timing-function: linear;
-webkit-animation-timing-function: linear;
animation-iteration-count: infinite;
-webkit-animation-iteration-count: infinite;
}
}
}
/* 图片选择器样式 */
.image-dialog {
&[v-cloak] {
display: none;
}
&-head {
clear: both;
height: 30px;
padding: 10px 12px;
}
&-search-input {
height: 30px;
line-height: 30px;
}
&-body {
height: 470px;
display: flex;
flex-wrap: wrap;
background: var(--ta-body-bg, #efefef);
padding-top: 12px;
padding-left: 12px;
align-content: flex-start;
}
&-item {
z-index: 1;
overflow: hidden;
position: relative;
margin-right: 12px;
margin-bottom: 12px;
border-radius: @BoxBorderRadius;
// 显示删除按钮
&:hover .image-dialog-item-close {
display: flex !important;
}
.uploadimage {
margin: 0;
width: 145px;
height: 145px;
background-color: #fff;
}
&-tool {
top: 0;
left: 0;
right: 0;
padding: 4px;
display: flex;
position: absolute;
}
&-type,
&-size {
padding: 3px 5px;
font-size: 11px;
line-height: 12px;
margin-right: 3px;
}
&-type,
&-size,
&-close {
color: #fafafa;
background: rgba(0, 0, 0, 0.6);
border-radius: 18px;
}
&-close {
top: 4px;
right: 4px;
width: 20px;
height: 20px;
cursor: pointer;
display: none;
position: absolute;
font-size: 14px;
background: rgba(238, 10, 10, 0.8);
font-weight: bold;
align-items: center;
justify-content: center;
&:hover {
color: #fff;
}
}
&-name {
left: 0;
right: 0;
bottom: 0;
color: #fff;
padding: 3px 10px;
position: absolute;
text-align: center;
line-height: 1.5em;
white-space: nowrap;
background: rgba(0, 0, 0, 0.6);
}
}
&-foot {
padding: 0 12px;
}
&-page {
height: 50px;
text-align: center;
.layui-laypage {
a,
span {
margin-bottom: 0;
}
}
}
&-button {
right: 10px;
bottom: 6px;
position: absolute;
z-index: 2;
#notSelect();
#defaTransition();
}
&-checked {
&:after,
&:before {
z-index: 2;
cursor: pointer;
content: "";
display: block;
position: absolute;
}
&:after {
top: -25px;
right: -25px;
width: 50px;
height: 50px;
transform: rotate(135deg);
-moz-transform: rotate(135deg);
-webkit-transform: rotate(135deg);
background-color: rgba(56, 169, 225, 0.8);
}
&:before {
top: 0;
left: 0;
right: 0;
bottom: 0;
border: 4px solid rgba(56, 169, 225, 0.8);
}
}
}
/* 权限树 */
.system-auth-tree {
padding: 18px 20px;
border: 1px solid #e8eef5;
border-radius: 10px;
background: #f8fbfd;
}
.auth-tree-panel {
display: grid;
gap: 16px;
}
.auth-tree-toolbar {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 12px;
position: sticky;
top: 0;
z-index: 5;
padding: 10px 0 12px;
background: #f8fbfd;
}
.auth-tree-toolbar-group {
display: inline-flex;
flex-wrap: wrap;
gap: 8px;
}
.auth-tree-toolbar-group-mode {
margin-left: auto;
}
.auth-tree-search {
flex: 1;
min-width: 240px;
position: relative;
.layui-input {
padding-right: 52px;
}
}
.auth-tree-search-clear {
position: absolute;
top: 50%;
right: 10px;
padding: 0;
color: #94a3b8;
border: none;
background: transparent;
transform: translateY(-50%);
cursor: pointer;
&:hover {
color: #0f766e;
}
}
.auth-tree-mode[data-selected-only="true"] {
color: #fff;
background: #0f766e;
border-color: #0f766e;
}
.auth-tree-ghost {
color: #475569;
background: #fff;
border-color: #d7e1ea;
}
.auth-tree-danger {
color: #b42318;
background: #fff;
border-color: #f1c7c4;
}
.auth-submit-diff {
padding-top: 6px;
}
.auth-submit-diff-head {
margin-bottom: 12px;
font-weight: 600;
color: #334155;
}
.auth-submit-diff-section + .auth-submit-diff-section {
margin-top: 12px;
}
.auth-submit-diff-title {
margin-bottom: 8px;
color: #475569;
font-size: 12px;
}
.auth-submit-diff-tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
max-height: 180px;
overflow: auto;
}
.auth-diff-tag {
display: inline-flex;
align-items: center;
padding: 4px 8px;
color: #334155;
font-size: 12px;
border-radius: 999px;
background: #f1f5f9;
}
.auth-tree-empty {
padding: 18px;
color: #6b7280;
text-align: center;
background: #fff;
border-radius: 8px;
}
.auth-plugin-card {
overflow: hidden;
border: 1px solid #e5edf5;
border-radius: 8px;
background: #fff;
}
.auth-plugin-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 12px 16px;
background: #fff;
border-bottom: 1px solid #eef3f8;
}
.auth-plugin-toggle,
.auth-group-toggle,
.auth-leaf-item {
display: inline-flex;
align-items: center;
gap: 8px;
cursor: pointer;
color: #1f2937;
}
.auth-plugin-title,
.auth-group-title {
padding: 0;
color: #1f2937;
font-weight: 600;
text-align: left;
border: none;
background: transparent;
cursor: pointer;
}
.auth-plugin-toggle {
flex: 0 0 auto;
}
.auth-plugin-title {
flex: 1 1 auto;
justify-content: flex-start;
margin-right: auto;
}
.auth-node-count {
margin-left: 8px;
color: #94a3b8;
font-size: 12px;
font-weight: 400;
}
.auth-plugin-card.is-collapsed .auth-plugin-title::after,
.auth-group.is-collapsed .auth-group-title::after {
content: '展开';
margin-left: 8px;
color: #94a3b8;
font-size: 12px;
font-weight: 400;
}
.auth-plugin-card.is-expanded .auth-plugin-title::after,
.auth-group.is-expanded .auth-group-title::after {
content: '收起';
margin-left: 8px;
color: #94a3b8;
font-size: 12px;
font-weight: 400;
}
.auth-plugin-code {
padding: 2px 8px;
color: #0369a1;
font-size: 12px;
background: #e0f2fe;
border-radius: 999px;
}
.auth-plugin-actions,
.auth-group-actions {
display: inline-flex;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.auth-plugin-body {
display: grid;
gap: 14px;
padding: 14px 16px 16px;
}
.auth-plugin-card.is-collapsed {
.auth-plugin-body {
display: none;
}
}
.auth-group {
padding: 12px 14px;
border: 1px solid #eef3f8;
border-radius: 8px;
background: #fbfdff;
}
.auth-group-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
}
.auth-group-toggle {
flex: 0 0 auto;
}
.auth-group-title {
flex: 1 1 auto;
justify-content: flex-start;
margin-right: auto;
}
.auth-group-action {
padding: 0;
color: #0369a1;
border: none;
background: transparent;
cursor: pointer;
}
.auth-plugin-title:hover,
.auth-group-title:hover,
.auth-group-action:hover,
.auth-group-switch:hover {
color: #0f766e;
}
.auth-group-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, max-content));
gap: 8px 10px;
margin-top: 12px;
padding-left: 18px;
align-items: start;
}
.auth-group.is-collapsed {
.auth-group-grid {
display: none;
}
}
.auth-leaf-item {
min-height: 30px;
padding: 5px 10px;
border: 1px solid #dbe7f3;
border-radius: 999px;
background: #fff;
transition: border-color .2s ease, background-color .2s ease, box-shadow .2s ease;
&:hover {
border-color: #93c5fd;
background: #f8fbff;
}
&:has(input:checked) {
border-color: #67b99a;
background: #edf9f3;
box-shadow: inset 0 0 0 1px rgba(0, 150, 136, 0.08);
}
span {
font-size: 12px;
line-height: 18px;
white-space: nowrap;
}
}
.auth-plugin-toggle input,
.auth-group-head input,
.auth-leaf-item input {
margin: 0;
}
@media (max-width: 768px) {
.auth-plugin-head,
.auth-group-head {
align-items: flex-start;
flex-direction: column;
}
.auth-group-grid {
grid-template-columns: 1fr;
padding-left: 0;
}
}
/* 图标选择器 */
body.ta-icon-picker-body {
margin: 0;
padding: 12px;
color: var(--ta-text-color, #333);
font-size: 12px;
background: var(--ta-body-bg, #f5f6f7);
}
.ta-icon-picker {
padding: 12px;
background: var(--ta-surface, #fff);
border: 1px solid var(--ta-border-color, #e2e8f0);
}
.ta-icon-picker__header {
display: flex;
gap: 10px;
align-items: center;
justify-content: space-between;
margin-bottom: 12px;
}
.ta-icon-picker__title {
font-size: 14px;
font-weight: 600;
}
.ta-icon-picker__search {
display: block;
flex: 1;
max-width: 220px;
.layui-input {
height: 34px;
line-height: 34px;
}
}
.ta-icon-picker__list {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
gap: 8px;
margin: 0;
padding: 0;
list-style: none;
}
.ta-icon-picker__item {
padding: 10px 8px;
color: var(--ta-text-color, #1f2937);
text-align: center;
cursor: pointer;
border: 1px solid var(--ta-border-color, #e2e8f0);
background: var(--ta-surface-soft, #fafafa);
transition: all 0.15s linear;
&:hover {
color: var(--ta-accent, #009688);
border-color: #b6d8d4;
background: #f3fbfa;
}
i {
display: block;
height: 32px;
line-height: 32px;
font-size: 26px !important;
color: inherit;
}
&.is-hidden {
display: none;
}
}
.ta-icon-picker__name {
height: 18px;
margin-top: 6px;
overflow: hidden;
color: inherit;
line-height: 18px;
white-space: nowrap;
text-overflow: ellipsis;
}
.portal-block-container {
font-size: 14px;
margin-bottom: 10px;
letter-spacing: 1px;
.portal-block {
&-icon {
top: 25%;
right: 30px;
position: absolute;
font-size: 65px;
color: rgba(255, 255, 255, 0.2);
}
&-item {
color: #fff;
padding: 15px 25px;
position: relative;
box-shadow: @ShadowOuterMax;
line-height: 3em;
text-shadow: 1px 1px 2px rgba(50, 50, 50, 0.8);
border-radius: @BoxBorderRadius;
#notSelect();
> div:nth-child(1),
&-name {
font-size: 16px;
font-weight: bold;
}
> div:nth-child(2),
&-numb {
display: inline;
font-size: 46px;
line-height: 46px;
}
&-unit {
display: inline;
position: absolute;
font-size: 12px;
margin-top: 10px;
margin-left: 10px;
}
&-desc {
font-size: 13px;
line-height: 2em;
}
}
}
}
label.think-radio,
label.think-checkbox {
cursor: pointer;
display: inline-block;
margin: 8px 10px 8px 6px;
&[data-width] {
width: 100px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
&[data-width^="150"] {
width: 150px;
}
&[data-width^="200"] {
width: 200px;
}
}
.theme-palette {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 10px;
&,
* {
box-sizing: border-box;
}
&-card {
width: calc((100% - 50px) / 6);
height: 144px;
flex: 0 0 calc((100% - 50px) / 6);
display: flex;
cursor: pointer;
position: relative;
overflow: hidden;
padding: 0;
flex-direction: column;
justify-content: flex-start;
background: var(--ta-surface, #fff);
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 6px;
box-shadow: none;
#defaTransition();
&:hover {
border-color: var(--ta-accent, #009688);
box-shadow: none;
}
&.active {
border-color: var(--ta-accent, #009688);
box-shadow: inset 0 0 0 1px var(--ta-accent, #009688);
.theme-palette-check {
opacity: 1;
transform: scale(1);
}
}
input {
top: 0;
left: 0;
width: 0;
height: 0;
opacity: 0;
display: none;
position: absolute;
pointer-events: none;
}
}
&-check {
top: 8px;
right: 8px;
width: 20px;
height: 20px;
color: #fff;
opacity: 0;
display: flex;
position: absolute;
z-index: 3;
border-radius: 4px;
align-items: center;
justify-content: center;
background: var(--ta-accent, #009688);
box-shadow: none;
font-size: 12px;
transform: scale(0.82);
#defaTransition();
}
&-preview {
width: 100%;
height: 88px;
display: block;
overflow: hidden;
position: relative;
z-index: 1;
border-radius: 0;
background: var(--theme-body, #f4f7fb);
box-shadow: none;
&-header,
&-side,
&-side-alt,
&-card,
&-line {
position: absolute;
display: block;
border-radius: 4px;
}
&-header {
top: 0;
left: 0;
right: 0;
height: 20px;
border-radius: 0;
background: var(--theme-header, #fff);
}
&-side {
top: 20px;
left: 0;
bottom: 0;
width: 30%;
border-radius: 0;
background: var(--theme-side, #20222a);
}
&-side-alt {
top: 20px;
left: 18%;
bottom: 0;
width: 24%;
opacity: 0;
border-radius: 0;
background: var(--theme-surface, #fff);
box-shadow: inset -1px 0 0 rgba(15, 23, 42, 0.08);
}
&-card {
background: var(--theme-surface, #fff);
box-shadow: none;
}
&-line {
height: 6px;
background: rgba(148, 163, 184, 0.18);
}
&-hero {
top: 30px;
left: 38%;
width: 50%;
height: 20px;
}
&-panel {
top: 60px;
left: 38%;
width: 22%;
height: 22px;
}
&-panel-right {
top: 60px;
right: 8%;
width: 22%;
height: 22px;
}
&-tone {
top: 28px;
left: 42%;
width: 16%;
height: 4px;
border-radius: 999px;
background: var(--theme-accent, #009688);
}
&-copy-1 {
top: 38px;
left: 42%;
width: 34%;
}
&-copy-2 {
top: 46px;
left: 42%;
width: 26%;
}
&-copy-3 {
top: 66px;
left: 42%;
width: 12%;
}
&-copy-4 {
top: 66px;
right: 14%;
width: 14%;
}
&.brand {
.theme-palette-preview-header {
background: var(--theme-accent, #009688);
}
.theme-palette-preview-side {
background: var(--theme-side, #20222a);
}
}
&.split {
.theme-palette-preview-header {
left: 42%;
}
.theme-palette-preview-side {
width: 18%;
background: var(--theme-side, #20222a);
}
.theme-palette-preview-side-alt {
opacity: 1;
}
.theme-palette-preview-hero,
.theme-palette-preview-panel {
left: 50%;
}
.theme-palette-preview-panel-right {
right: 6%;
}
.theme-palette-preview-tone,
.theme-palette-preview-copy-1,
.theme-palette-preview-copy-2,
.theme-palette-preview-copy-3 {
left: 54%;
}
.theme-palette-preview-copy-4 {
right: 14%;
}
}
}
&-title {
position: relative;
z-index: 1;
width: 100%;
overflow: hidden;
color: var(--ta-text-color, #1f2937);
padding-right: 24px;
font-size: 12px;
font-weight: 600;
line-height: 1.3;
white-space: nowrap;
text-overflow: ellipsis;
text-shadow: none;
}
&-layout {
position: relative;
z-index: 1;
max-width: calc(100% - 28px);
padding: 1px 6px;
display: inline-flex;
align-items: center;
align-self: flex-start;
overflow: hidden;
color: var(--ta-text-muted, #64748b);
font-size: 10px;
line-height: 1.25;
white-space: nowrap;
text-overflow: ellipsis;
border-radius: 4px;
background: var(--ta-surface-soft, #f8fafc);
border: 1px solid var(--ta-border-color, @BoxBorderColor);
}
&-meta {
flex: 1;
min-height: 0;
width: 100%;
padding: 10px 10px 8px;
position: relative;
z-index: 1;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 4px;
background: var(--ta-surface, #fff);
}
}
.theme-config-picker {
cursor: pointer;
.layui-input {
cursor: pointer;
padding-right: 42px;
background: var(--ta-surface, #fff);
}
.input-right-icon {
pointer-events: none;
}
}
.think-radio,
.think-checkbox {
.notselect();
margin-top: 10px;
font-weight: 400;
line-height: 16px;
input[type="radio"],
input[type="checkbox"] {
width: 18px;
height: 18px;
cursor: pointer;
border: 1px solid @RadioBorderNormalColor;
overflow: hidden;
position: relative;
background: #fff;
margin-right: 5px;
vertical-align: bottom;
display: inline-block !important;
box-sizing: border-box !important;
appearance: none;
-webkit-appearance: none;
&:checked {
border-color: var(--ta-accent, #009688);
&:after {
display: block;
position: relative;
animation-duration: 0.3s;
animation-fill-mode: both;
animation-name: layui-fadein;
-webkit-animation-duration: 0.3s;
-webkit-animation-fill-mode: both;
-webkit-animation-name: layui-fadein;
}
}
}
input[type="radio"] {
border-radius: 1em;
&:checked:after {
top: 4px;
left: 4px;
width: 8px;
height: 8px;
cursor: pointer;
content: "";
background: var(--ta-accent, #009688);
border-radius: 1em;
}
}
input[type="checkbox"] {
border-radius: 1px;
&:checked:after {
color: var(--ta-accent, #009688);
cursor: pointer;
padding: 2px;
content: "\e605";
#iconLayout(12px);
font-weight: 700;
}
}
}
.pagination-container {
margin-top: 20px;
line-height: 30px;
padding-top: 5px;
padding-bottom: 5px;
span {
color: #666;
font-size: 9pt;
}
select {
border: 1px solid #ddd;
}
ul {
float: right;
height: 30px;
margin: 0;
padding: 0;
display: inline-block;
li {
z-index: 1;
height: 30px;
line-height: 30px;
display: inline-block;
a,
span {
color: #333;
width: 30px;
height: 30px;
border: 1px solid @BoxBorderColor;
overflow: hidden;
font-size: 12px;
text-align: center;
line-height: 30px;
margin-right: 3px;
display: inline-block;
box-sizing: border-box;
}
span {
cursor: default;
background: #dcdcdc;
}
a:hover {
border-color: var(--ta-accent, #009688);
}
&.active {
z-index: 2;
span {
color: #fff;
border-color: var(--ta-accent, #009688);
background: var(--ta-accent, #009688) !important;
}
}
&.disabled {
span {
font-size: 16px;
font-weight: 700;
line-height: 22px;
}
}
&:last-child,
&:first-child {
a,
span {
font-size: 16px;
font-weight: 700;
line-height: 28px;
}
}
}
}
}
body.layui-layout-body {
color: var(--ta-text-color, #333);
.layui-btn {
position: relative;
overflow: hidden;
border-radius: 10px;
border: 1px solid transparent;
background-clip: padding-box;
font-weight: 500;
letter-spacing: 0.01em;
transition:
border-color 0.2s linear,
box-shadow 0.2s linear,
background-color 0.2s linear,
color 0.2s linear,
transform 0.2s linear;
}
.layui-btn:not(.layui-btn-primary) {
box-shadow: none;
}
.layui-btn:hover {
transform: none;
}
.layui-btn.layui-btn-disabled,
.layui-btn[disabled],
.layui-btn-disabled:hover,
.layui-btn[disabled]:hover {
transform: none;
box-shadow: none !important;
}
.layui-btn:not(.layui-btn-disabled):not([disabled]):hover {
border-color: transparent;
}
.layui-btn-primary {
color: var(--ta-text-color, #333);
border-color: var(--ta-border-color, @BoxBorderColor);
background-color: var(--ta-surface, #fff);
box-shadow: none;
}
.layui-btn-primary:hover {
color: var(--ta-accent, #009688);
border-color: var(--ta-accent, #009688);
background-color: var(--ta-accent-soft, rgba(0, 150, 136, 0.08));
box-shadow: none;
}
.layui-btn-normal {
box-shadow: none;
}
.layui-btn-warm {
box-shadow: none;
}
.layui-btn-danger {
box-shadow: none;
}
.layui-btn-lg {
border-radius: 12px;
}
.layui-btn-sm {
border-radius: 8px;
}
.layui-btn-xs {
border-radius: 6px;
}
.layui-btn-group {
display: inline-flex;
align-items: stretch;
vertical-align: middle;
overflow: hidden;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 6px;
background: var(--ta-surface, #fff);
box-shadow: none;
}
.layui-btn-group .layui-btn {
margin: 0 !important;
border-width: 0;
border-radius: 0;
position: relative;
box-shadow: none !important;
transform: none !important;
}
.layui-btn-group .layui-btn + .layui-btn {
margin-left: 0 !important;
}
.layui-btn-group .layui-btn + .layui-btn::before {
content: "";
position: absolute;
top: 8px;
bottom: 8px;
left: 0;
width: 1px;
background: var(--ta-border-color, @BoxBorderColor);
}
.layui-btn-group .layui-btn:first-child {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.layui-btn-group .layui-btn:last-child {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.layui-btn-group .layui-btn:hover::before,
.layui-btn-group .layui-btn.layui-btn-active::before {
background: var(--ta-accent-deep, rgba(0, 150, 136, 0.22));
}
.layui-input,
.layui-textarea,
.layui-select,
.layui-unselect,
.layui-form-select .layui-input {
border-color: var(--ta-border-color, @BoxBorderColor);
border-radius: 8px;
background-color: var(--ta-surface, #fff);
transition:
border-color 0.2s linear,
box-shadow 0.2s linear,
background-color 0.2s linear;
}
.layui-input:focus,
.layui-textarea:focus,
.layui-form-selected .layui-input {
border-color: var(--ta-accent, #009688) !important;
box-shadow: 0 0 0 4px var(--ta-accent-soft, rgba(0, 150, 136, 0.12));
}
.layui-form-select dl dd.layui-this,
.layui-form-select dl dd:hover {
background: var(--ta-accent-soft, rgba(0, 150, 136, 0.12));
color: var(--ta-accent, #009688);
}
.layui-table-view,
.layui-tab-card,
.layui-form-select dl,
.layui-layer-page,
.layui-panel,
.layui-card {
border-color: var(--ta-border-color, @BoxBorderColor);
}
.layui-table-view,
.layui-tab-card,
.layui-layer-page,
.layui-panel {
border-radius: var(--ta-radius-md, @BoxBorderRadius);
overflow: hidden;
background: var(--ta-surface, #fff);
}
.layui-table-view,
.layui-form-select dl,
.layui-layer-page {
box-shadow: var(--ta-shadow-sm, @ShadowOuterMax);
}
.layui-tab-card {
box-shadow: none;
}
.layui-layer-page {
box-shadow: none;
}
.layui-tab-card > .layui-tab-title,
.layui-table-view .layui-table-header,
.layui-table-tool,
.layui-layer-title {
background: var(--ta-surface-soft, #f8fafc);
}
.layui-table-view {
box-shadow: none;
}
.layui-table-view .layui-table-header {
border-bottom: 1px solid var(--ta-border-color, @BoxBorderColor);
background: linear-gradient(
180deg,
var(--ta-surface-soft, #f8fafc) 0%,
var(--ta-surface, #fff) 100%
);
}
.layui-table-view .layui-table-header table,
.layui-table-view .layui-table-header thead tr {
background: transparent;
}
.layui-table-view .layui-table-header th {
border-top: 0;
border-bottom: 0;
border-left: 0;
border-right: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 0 !important;
background: transparent;
box-shadow: none;
}
.layui-table-view .layui-table-header th:last-child {
border-right: 0;
}
.layui-table-view .layui-table-header .layui-table-cell {
height: 38px;
padding-top: 0;
padding-bottom: 0;
line-height: 38px;
font-weight: 600;
}
.layui-table td,
.layui-table th {
border-radius: 0;
border-color: var(--ta-border-color, @BoxBorderColor);
}
.layui-table tbody tr:hover,
.layui-table-click {
background-color: rgba(15, 23, 42, 0.02);
}
.layui-card-header {
color: var(--ta-text-color, #333);
font-weight: 600;
text-align: left;
}
.layui-tab-brief > .layui-tab-title .layui-this,
.layui-tab-card > .layui-tab-title .layui-this {
color: var(--ta-accent, #009688);
}
.layui-form-checked[lay-skin="primary"] i,
.layui-form-onswitch,
.layui-laypage .layui-laypage-curr .layui-laypage-em {
border-color: var(--ta-accent, #009688);
background-color: var(--ta-accent, #009688);
}
.layui-tab-brief > .layui-tab-more li.layui-this:after,
.layui-tab-brief > .layui-tab-title .layui-this:after {
border-bottom-color: var(--ta-accent, #009688);
}
.layui-form-radio > i:hover,
.layui-form-radioed > i,
.layui-form-checkbox[lay-skin="primary"]:hover i,
.layui-form-checked[lay-skin="primary"] i,
.layui-laypage a:hover,
.layui-laypage button:hover {
color: var(--ta-accent, #009688);
}
.plugin-showcase-head {
margin-bottom: 16px;
}
.plugin-showcase-summary {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border-radius: 6px;
color: var(--ta-text-color, #333);
background: var(--ta-surface-soft, #f8fafc);
border: 1px solid var(--ta-border-color, @BoxBorderColor);
}
.plugin-showcase-count {
min-width: 54px;
height: 54px;
display: inline-flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 20px;
font-weight: 700;
border-radius: 6px;
background: var(--ta-accent, #009688);
box-shadow: none;
}
.plugin-showcase-copy {
font-size: 13px;
line-height: 1.7;
color: var(--ta-text-muted, #64748b);
}
.plugin-showcase-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
}
.plugin-showcase-card {
display: flex;
flex-direction: column;
min-width: 0;
border-radius: 6px;
overflow: hidden;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
background: var(--ta-surface, #fff);
box-shadow: none;
transition:
transform 0.2s linear,
box-shadow 0.2s linear,
border-color 0.2s linear;
}
.plugin-showcase-card:hover {
transform: translateY(-1px);
border-color: var(--ta-accent, #009688);
box-shadow: none;
}
.plugin-showcase-card-head {
display: flex;
align-items: center;
gap: 12px;
padding: 16px 16px 12px 16px;
background: var(--ta-surface, #fff);
border-bottom: 1px solid var(--ta-border-color, @BoxBorderColor);
}
.plugin-showcase-mark {
width: 42px;
height: 42px;
flex: 0 0 42px;
display: inline-flex;
align-items: center;
justify-content: center;
color: var(--ta-accent, #009688);
font-size: 18px;
font-weight: 700;
text-transform: uppercase;
border-radius: 6px;
background: var(--ta-accent-soft, rgba(0, 150, 136, 0.12));
box-shadow: inset 0 0 0 1px var(--ta-accent-deep, rgba(0, 150, 136, 0.22));
}
.plugin-showcase-titlebox {
flex: 1;
min-width: 0;
}
.plugin-showcase-app {
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.4;
letter-spacing: 0.03em;
}
.plugin-showcase-name {
color: var(--ta-text-color, #333);
font-size: 16px;
font-weight: 700;
line-height: 1.5;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.plugin-showcase-badge {
flex: 0 0 auto;
padding: 4px 10px;
font-size: 11px;
line-height: 1.4;
color: var(--ta-accent, #009688);
border-radius: 999px;
background: var(--ta-accent-soft, rgba(0, 150, 136, 0.12));
border: 1px solid var(--ta-accent-deep, rgba(0, 150, 136, 0.22));
}
.plugin-showcase-card-body {
display: flex;
flex-direction: column;
gap: 14px;
padding: 16px;
}
.plugin-showcase-item {
display: flex;
flex-direction: column;
gap: 8px;
min-width: 0;
}
.plugin-showcase-item.split {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
}
.plugin-showcase-label {
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.4;
}
.plugin-showcase-tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.plugin-showcase-tag {
padding: 5px 10px;
color: var(--ta-text-color, #333);
font-size: 12px;
line-height: 1.4;
border-radius: 999px;
background: var(--ta-surface, #fff);
border: 1px solid var(--ta-border-color, @BoxBorderColor);
}
.plugin-showcase-tag.muted {
color: var(--ta-text-muted, #64748b);
background: var(--ta-surface-soft, #f8fafc);
}
.plugin-showcase-package,
.plugin-showcase-value {
min-width: 0;
color: var(--ta-text-color, #333);
font-size: 13px;
line-height: 1.7;
word-break: break-all;
}
.plugin-showcase-package a {
color: var(--ta-accent, #009688);
}
.plugin-showcase-metric {
display: flex;
flex-direction: column;
gap: 6px;
padding: 12px;
border-radius: 12px;
background: var(--ta-surface, #fff);
border: 1px solid var(--ta-border-color, @BoxBorderColor);
}
.plugin-center-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 15px;
align-items: stretch;
}
.plugin-center-grid__item {
min-width: 0;
}
.plugin-center-grid__item--empty {
grid-column: 1 / -1;
}
.plugin-card {
display: flex;
flex-direction: column;
overflow: hidden;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 6px;
background: var(--ta-surface, #fff);
box-shadow: none;
}
.plugin-card:hover {
border-color: var(--ta-accent-deep, rgba(0, 150, 136, 0.22));
}
.plugin-card.is-default {
border-color: var(--ta-accent, #009688);
box-shadow: none;
}
.plugin-card::after {
display: none;
}
.plugin-card:hover::after,
.plugin-card.is-default::after {
opacity: 1;
}
.plugin-card__cover {
position: relative;
display: flex;
min-height: 92px;
flex-direction: column;
justify-content: space-between;
gap: 8px;
overflow: hidden;
padding: 10px 12px;
background: var(--ta-surface-soft, #f8fafc);
background-position: center;
background-size: cover;
border-bottom: 1px solid var(--ta-border-color, @BoxBorderColor);
cursor: pointer;
}
.plugin-card__cover.has-cover {
background-color: var(--ta-surface-soft, #f8fafc);
}
.plugin-card__cover:not([data-plugs-click]) {
cursor: default;
}
.plugin-card__cover-mask {
position: absolute;
inset: 0;
background: transparent;
}
.plugin-card__badges,
.plugin-card__cover-main {
position: relative;
z-index: 1;
}
.plugin-card__badges {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.plugin-card__badge {
display: inline-flex;
align-items: center;
height: 22px;
padding: 0 8px;
border-radius: 4px;
background: var(--ta-surface, #fff);
color: var(--ta-text-color, #1f2937);
font-size: 12px;
line-height: 1;
box-shadow: none;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
}
.plugin-card__badge--ghost {
background: var(--ta-surface-soft, #f8fafc);
border-color: var(--ta-border-color, @BoxBorderColor);
}
.plugin-card__badge--accent {
background: #fef3c7;
color: #92400e;
border-color: #fcd34d;
}
.plugin-card__cover-main {
display: flex;
flex-direction: column;
gap: 4px;
min-height: 0;
justify-content: flex-end;
}
.plugin-card__cover-kicker {
font-size: 12px;
letter-spacing: 0;
color: var(--ta-text-muted, #64748b);
}
.plugin-card__cover-title {
overflow: hidden;
font-size: 16px;
line-height: 1.4;
font-weight: 600;
color: var(--ta-text-color, #1f2937);
text-overflow: ellipsis;
white-space: nowrap;
}
.plugin-card__cover-hint {
font-size: 12px;
line-height: 1.5;
color: var(--ta-text-muted, #64748b);
}
.plugin-card__body {
display: flex;
flex: 1;
flex-direction: column;
padding: 12px;
}
.plugin-card__title-row {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
}
.plugin-card__title {
flex: 1;
min-width: 0;
font-size: 16px;
line-height: 1.5;
font-weight: 600;
color: var(--ta-text-color, #333);
}
.plugin-card__tag {
flex-shrink: 0;
padding: 2px 8px;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
border-radius: 4px;
background: var(--ta-surface-soft, #f8fafc);
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.5;
font-weight: 600;
}
.plugin-card__desc {
display: -webkit-box;
overflow: hidden;
margin-top: 8px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1.7;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.plugin-card__meta {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
margin-top: 10px;
}
.plugin-card__meta-item {
min-width: 0;
padding: 8px 10px;
border-radius: 4px;
background: #fafafa;
border: 1px solid var(--ta-border-color, @BoxBorderColor);
}
.plugin-card__meta-label {
display: block;
margin-bottom: 4px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
line-height: 1;
}
.plugin-card__meta-value {
display: block;
overflow: hidden;
color: var(--ta-text-color, #333);
font-size: 13px;
line-height: 1.5;
font-weight: 600;
white-space: nowrap;
text-overflow: ellipsis;
}
.plugin-card__footer {
display: flex;
align-items: center;
gap: 8px;
margin-top: auto;
padding-top: 10px;
}
.plugin-card__action {
flex: 1;
height: 34px;
padding: 0 12px;
border-radius: 4px !important;
font-size: 13px;
font-weight: 600;
line-height: 34px;
text-align: center;
box-shadow: none !important;
}
.plugin-card__action--ghost {
background: transparent;
}
.plugin-card__action--ghost:hover {
background: transparent;
}
.plugin-card__action--disabled,
.plugin-card__action--disabled:hover {
box-shadow: none;
cursor: not-allowed;
}
.plugin-empty {
padding: 24px 16px;
text-align: center;
border: 1px dashed var(--ta-border-color, @BoxBorderColor);
border-radius: 6px;
background: var(--ta-surface-soft, #f8fafc);
}
.plugin-empty__title {
color: var(--ta-text-color, #333);
font-size: 16px;
font-weight: 600;
}
.plugin-empty__desc {
margin-top: 6px;
color: var(--ta-text-muted, #64748b);
font-size: 12px;
}
@media screen and (max-width: 1280px) {
.plugin-showcase-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media screen and (max-width: 991px) {
.plugin-center-grid {
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
}
}
@media screen and (max-width: 760px) {
.plugin-showcase-summary,
.plugin-showcase-card-head {
align-items: flex-start;
flex-direction: column;
}
.plugin-showcase-grid,
.plugin-showcase-item.split {
grid-template-columns: minmax(0, 1fr);
}
.plugin-center-grid {
grid-template-columns: minmax(0, 1fr);
gap: 12px;
}
.plugin-card__meta {
grid-template-columns: 1fr;
}
.plugin-card__cover {
min-height: 88px;
}
.plugin-card__cover-title {
font-size: 15px;
}
.plugin-card__footer {
flex-direction: column;
}
.plugin-card__action {
width: 100%;
}
}
@media screen and (max-width: 480px) {
.plugin-card__body {
padding: 10px;
}
.plugin-card__cover {
padding: 10px;
}
}
}
.hr-line- {
&dashed {
color: #fff;
height: 1px;
margin: 15px 0;
background-color: #fff;
border-top: 1px dashed #e7eaec;
}
&solid {
margin-top: 15px;
margin-bottom: 15px;
border-bottom: 1px solid #e7eaec;
background-color: rgba(0, 0, 0, 0);
}
}
.pull- {
&left {
float: left !important;
}
&right {
float: right !important;
}
}
.full {
width: 100% !important;
height: 100% !important;
&-width {
width: 100% !important;
}
&-height {
height: 100% !important;
}
}
@sizes: 10, 12, 14;
@colors: {
red: #e44;
blue: #29f;
desc: #999;
text: #333;
green: #090;
};
.sub-span {
each(@colors, {
&-@{key} span {
color: @value;
}
});
}
.color {
each(@colors, {
&-@{key} {
color: @value !important;
}
});
}
.sub-strong {
each(@colors, {
&-@{key} b {
color: @value;
}
})
each(@sizes, {
&-s@{value} b {
font-size: @value *1px;
}
});
}
.think-bg {
&-none {
background: none !important;
}
@bgStyles:
-red #fff #ba2e26 #e83a30,
-gray #333 #efefef #f0f0f0,
-blue #fff #3165cc #3d7eff,
-orig #fff #cc5a36 #ff7043,
-green #fff #24aa35 #10da29,
-violet #fff #c543d8 #925cc3,
-purple #fff #6e26ba #892fe8,
-brown #fff #743f23 #914f2c,
-white #333 white white;
each(@bgStyles, {
@name: extract(@value, 1);
@color: extract(@value, 2);
@bgColor1: extract(@value, 3);
@bgColor2: extract(@value, 4);
&@{name} {
color: @color;
background: linear-gradient(-125deg, @bgColor1, @bgColor2) !important;
}
});
}
.text- {
@ts:
top vertical-align,
left text-align,
right text-align,
center text-align,
middle vertical-align,
bottom vertical-align;
each(@ts, {
@name: extract(@value, 1);
@field: extract(@value, 2);
&@{name} {
@{field}: @name !important;
}
});
}
.font {
&-code {
font-family:
"Courier New", "Lucida Console", "Consolas", "Helvetica Neue",
"Helvetica", "PingFang SC", "Tahoma", "Arial", sans-serif;
}
each(range(10, 40), {
&-s@{value} {
font-size: 1px* @value !important;
}
})
each(range(1, 9), {
&-w@{value} {
font-weight: @value*100 !important
}
});
}
.b0 {
border: 0 !important;
}
.ba {
border: 1px solid @BoxBorderColor;
}
.bt {
border-top: 1px solid @BoxBorderColor;
}
.br {
border-right: 1px solid @BoxBorderColor;
}
.bb {
border-bottom: 1px solid @BoxBorderColor;
}
.bl {
border-left: 1px solid @BoxBorderColor;
}
.bt0 {
border-top: 0 !important;
}
.br0 {
border-right: 0 !important;
}
.bb0 {
border-bottom: 0 !important;
}
.bl0 {
border-left: 0 !important;
}
.border-radius {
border-radius: 50% !important;
each(range(0, 6), {
&-@{value} {
border-radius: 1px*@value !important
}
})
&-left-0 {
border-top-left-radius: 0 !important;
border-bottom-left-radius: 0 !important;
}
&-right-0 {
border-top-right-radius: 0 !important;
border-bottom-right-radius: 0 !important;
}
}
@keyframes loading {
17% {
border-bottom-right-radius: 3px;
}
25% {
transform: translateY(9px) rotate(22.5deg);
}
50% {
border-bottom-right-radius: 40px;
transform: translateY(18px) scale(1, 0.9) rotate(45deg);
}
75% {
transform: translateY(9px) rotate(67.5deg);
}
100% {
transform: translateY(0) rotate(90deg);
}
}
@-webkit-keyframes loading {
17% {
border-bottom-right-radius: 3px;
}
25% {
transform: translateY(9px) rotate(22.5deg);
}
50% {
transform: translateY(18px) scale(1, 0.9) rotate(45deg);
border-bottom-right-radius: 40px;
}
75% {
transform: translateY(9px) rotate(67.5deg);
}
100% {
transform: translateY(0) rotate(90deg);
}
}
@keyframes shadow {
0%,
100% {
transform: scale(1, 1);
}
50% {
transform: scale(1.2, 1);
}
}
@-webkit-keyframes shadow {
0%,
100% {
transform: scale(1, 1);
}
50% {
transform: scale(1.2, 1);
}
}