feat: shrimp-admin v0.1.0 — 从 hand-admin 抽离的框架前端

Shrimp 框架前端 — 一种消费 ShrimpServer + ShrimpTable 契约的经典 Vue3 +
Element Plus 实现。不是框架本身,只是按 shrimp-server 约定写的一份参考解法。

包含:
- ShrimpClient + VueAdmin(factory:createShrimpAdmin)
- 5 个 Shrimp* 组件 + 10 个内置 Field*.vue + PowerTree + LangSwitch
- 4 个内置模块:user / role / operationLog / FieldRelativeTime
- 完整后台壳 views(layout/login/sideM/topbar/userbar/navMenu/App/404/logo)
- composables/useTableUrlSync, locales(zh-cn/en 框架默认), style 全套

API 改造:
- createShrimpAdmin({ config, moduleSources, customFields, locales }) factory
- vueAdmin 改为 Proxy 单例,createShrimpAdmin 调用前访问会抛错
- import.meta.glob 业务字段/模块由消费侧传入(vite 静态扫描机制限制)
- 框架默认 locales 与消费侧 locales 在 i18n 初始化时合并

源码 ship 不打包,消费侧靠 vite 直接吃 .ts/.vue。
This commit is contained in:
2026-05-23 21:01:33 +08:00
parent b4ee2e4b43
commit 4cb3bb8d75
50 changed files with 6551 additions and 0 deletions
+521
View File
@@ -0,0 +1,521 @@
/* 全局 */
#app,
body,
html {
width: 100%;
height: 100%;
background-color: #f6f8f9;
font-size: 12px;
font-family: "sans-serif";
}
a {
color: #333;
text-decoration: none;
}
a:hover,
a:focus {
color: #000;
text-decoration: none;
}
a:link {
text-decoration: none;
}
a:-webkit-any-link {
text-decoration: none;
}
a,
button,
input,
textarea {
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
box-sizing: border-box;
outline: none !important;
-webkit-appearance: none;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
outline: none;
}
/* 大布局样式 */
.aminui {
display: flex;
flex-flow: column;
}
.aminui-wrapper {
display: flex;
flex: 1;
overflow: auto;
}
/* 全局滚动条样式 */
.scrollabel {
-webkit-overflow-scrolling: touch;
}
::-webkit-scrollbar {
width: 5px;
height: 5px;
}
::-webkit-scrollbar-thumb {
background-color: rgba(50, 50, 50, 0.3);
}
::-webkit-scrollbar-thumb:hover {
background-color: rgba(50, 50, 50, 0.6);
}
::-webkit-scrollbar-track {
background-color: rgba(50, 50, 50, 0.1);
}
::-webkit-scrollbar-track:hover {
background-color: rgba(50, 50, 50, 0.2);
}
/*布局设置*/
.layout-setting {
position: fixed;
width: 40px;
height: 40px;
border-radius: 3px 0 0 3px;
bottom: 100px;
right: 0px;
z-index: 100;
background: #409EFF;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
}
.layout-setting i {
font-size: 18px;
color: #fff;
}
/* 头部 */
.adminui-header {
height: 58px;
background: #222b45;
color: #fff;
display: flex;
justify-content: space-between;
}
.adminui-header-left {
display: flex;
align-items: center;
padding-left: 20px;
}
.adminui-header-right {
display: flex;
align-items: center;
}
.adminui-header .logo-bar {
font-size: 20px;
font-weight: bold;
display: flex;
align-items: center;
}
.adminui-header .logo-bar .logo {
margin-right: 10px;
width: 35px;
height: 35px;
}
.adminui-header .nav {
display: flex;
height: 100%;
margin-left: 40px;
}
.adminui-header .nav li {
padding: 0 10px;
margin: 0 10px 0 0;
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
list-style: none;
height: 100%;
display: flex;
align-items: center;
cursor: pointer;
}
.adminui-header .nav li i {
margin-right: 5px;
}
.adminui-header .nav li:hover {
color: #fff;
}
.adminui-header .nav li.active {
background: rgba(255, 255, 255, 0.1);
color: #fff;
}
.adminui-header .user-bar .panel-item:hover {
background: rgba(255, 255, 255, 0.1) !important;
}
.adminui-header .user-bar .user label {
color: #fff;
}
/* 左侧菜单 */
.aminui-side-split {
width: 65px;
flex-shrink: 0;
background: #222b45;
display: flex;
flex-flow: column;
}
.aminui-side-split-top {
height: 49px;
}
.aminui-side-split-top a {
display: inline-block;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.aminui-side-split-top .logo {
height: 30px;
vertical-align: bottom;
}
.adminui-side-split-scroll {
display: flex;
flex-direction: column;
overflow: hidden;
height: 100%;
flex: 1;
}
.aminui-side-split li {
cursor: pointer;
width: 65px;
height: 65px;
color: #fff;
text-align: center;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.aminui-side-split li i {
font-size: 18px;
}
.aminui-side-split li p {
margin-top: 5px;
padding: 0 4px;
font-size: 12px;
line-height: 1.2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 100%;
}
.aminui-side-split li:hover {
background: rgba(255, 255, 255, 0.1);
}
.aminui-side-split li.active {
background: #409EFF;
}
.adminui-side-split-scroll::-webkit-scrollbar-thumb {
background-color: rgba(255, 255, 255, 0.4);
border-radius: 5px;
}
.adminui-side-split-scroll::-webkit-scrollbar-thumb:hover {
background-color: rgba(255, 255, 255, 0.5);
}
.adminui-side-split-scroll::-webkit-scrollbar-track {
background-color: rgba(255, 255, 255, 0);
}
.adminui-side-split-scroll::-webkit-scrollbar-track:hover {
background-color: rgba(255, 255, 255, 0);
}
.aminui-side {
display: flex;
flex-flow: column;
flex-shrink: 0;
width: 210px;
background: #fff;
box-shadow: 2px 0 8px 0 rgba(29, 35, 41, .05);
border-right: 1px solid #e6e6e6;
transition: width 0.3s;
}
.adminui-side-top {
border-bottom: 1px solid #ebeef5;
height: 50px;
line-height: 50px;
}
.adminui-side-top h2 {
padding: 0 20px;
font-size: 17px;
color: #3c4a54;
}
.adminui-side-scroll {
overflow: auto;
overflow-x: hidden;
flex: 1;
}
.adminui-side-bottom {
border-top: 1px solid #ebeef5;
height: 51px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
}
.adminui-side-bottom i {
font-size: 16px;
}
.adminui-side-bottom:hover {
color: var(--el-color-primary);
}
.aminui-side.isCollapse {
width: 65px;
}
.el-menu .menu-tag {
position: absolute;
height: 18px;
line-height: 18px;
background: var(--el-color-danger);
font-size: 12px;
color: #fff;
right: 20px;
border-radius: 18px;
padding: 0 6px;
}
.el-menu .el-sub-menu__title .menu-tag {
right: 40px;
}
.el-menu--horizontal>li .menu-tag {
display: none;
}
/* 右侧内容 */
.aminui-body {
flex: 1;
display: flex;
flex-flow: column;
}
.adminui-topbar {
height: 50px;
border-bottom: 1px solid #ebeef5;
background: #fff;
box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
display: flex;
justify-content: space-between;
}
.adminui-topbar .left-panel {
display: flex;
align-items: center;
}
.adminui-topbar .right-panel {
display: flex;
align-items: center;
}
.right-panel-search {
display: flex;
align-items: center;
}
.right-panel-search>*+* {
margin-left: 10px;
}
.adminui-tags {
height: 35px;
background: #fff;
border-bottom: 1px solid #e6e6e6;
}
.adminui-tags ul {
display: flex;
overflow: hidden;
}
.adminui-tags li {
cursor: pointer;
display: inline-block;
float: left;
height: 34px;
line-height: 34px;
position: relative;
flex-shrink: 0;
}
.adminui-tags li::after {
content: " ";
width: 1px;
height: 100%;
position: absolute;
right: 0px;
background-image: linear-gradient(#fff, #e6e6e6);
}
.adminui-tags li a {
display: inline-block;
padding: 0 10px;
width: 100%;
height: 100%;
color: #999;
text-decoration: none;
display: flex;
align-items: center;
}
.adminui-tags li i {
margin-left: 10px;
border-radius: 3px;
width: 18px;
height: 18px;
display: flex;
align-items: center;
justify-content: center;
}
.adminui-tags li i:hover {
background: rgba(0, 0, 0, .2);
color: #fff;
}
.adminui-tags li:hover {
background: #ecf5ff;
}
.adminui-tags li.active {
background: #409EFF;
}
.adminui-tags li.active a {
color: #fff;
}
.adminui-tags li.sortable-ghost {
opacity: 0;
}
.adminui-main {
overflow: hidden;
background-color: #f6f8f9;
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
/* 让路由内容铺满 .adminui-main,使内部的滚动容器(如 ShrimpTable 的 .el-main)能拿到正确高度 */
.adminui-main > * {
flex: 1;
min-height: 0;
}
/*页面最大化*/
.aminui.main-maximize {
.main-maximize-exit {
display: block;
}
.aminui-side-split,
.aminui-side,
.adminui-header,
.adminui-topbar,
.adminui-tags {
display: none;
}
}
.main-maximize-exit {
display: none;
position: fixed;
z-index: 3000;
top: -20px;
left: 50%;
margin-left: -20px;
border-radius: 50%;
width: 40px;
height: 40px;
cursor: pointer;
background: rgba(0, 0, 0, 0.2);
text-align: center;
}
.main-maximize-exit i {
font-size: 14px;
margin-top: 22px;
color: #fff;
}
.main-maximize-exit:hover {
background: rgba(0, 0, 0, 0.4);
}
/*定宽页面*/
.sc-page {
width: 1230px;
margin: 0 auto;
}
.el-drawer .el-form-item {
display: block;
}
// .el-drawer.rtl {width: min(600px, 100%)!important;}
//新增全局字体样式
.el-tag+.el-tag {
margin-left: 5px;
}
.el-button+.el-button {
margin-left: 5px;
}
.el-table .el-table__cell {
padding: 5px;
}
+42
View File
@@ -0,0 +1,42 @@
@use 'element-plus/theme-chalk/src/dark/css-vars.scss';
html.dark {
//变量
--el-text-color-primary: #d0d0d0;
--el-color-primary-dark-2: var(--el-color-primary-light-2) !important;
--el-color-primary-light-9: var(--el-color-primary-dark-8) !important;
--el-color-primary-light-8: var(--el-color-primary-dark-7) !important;
--el-color-primary-light-7: var(--el-color-primary-dark-6) !important;
--el-color-primary-light-5: var(--el-color-primary-dark-4) !important;
--el-color-primary-light-3: var(--el-color-primary-dark-3) !important;
//背景
#app {background: var(--el-bg-color);}
//登录背景
.login_bg {background: var(--el-bg-color);}
//框架
.adminui-header {background: var(--el-bg-color-overlay);border-bottom: 1px solid var(--el-border-color-light);height:59px;}
.aminui-side-split {background: var(--el-bg-color);}
.aminui-side-split li {color: var(--el-text-color-primary);}
.aminui-side {background: var(--el-bg-color-overlay);border-color: var(--el-border-color-light);}
.adminui-side-top, .adminui-side-bottom {border-color: var(--el-border-color-light);}
.adminui-side-top h2 {color: var(--el-text-color-primary);}
.adminui-topbar, .adminui-tags {background: var(--el-bg-color-overlay);border-color: var(--el-border-color-light);}
.adminui-main {background: var(--el-bg-color);}
.drawerBG {background: var(--el-bg-color);}
.adminui-header-menu .el-menu {--el-menu-bg-color:var(--el-bg-color-overlay) !important;--el-menu-hover-bg-color: #171819 !important;}
.adminui-header-menu .el-menu .el-sub-menu__title {background-color:transparent !important;}
//全局滚动条样式
::-webkit-scrollbar-thumb {background-color: rgba(163, 166, 173, 0.3);}
::-webkit-scrollbar-thumb:hover {background-color: rgba(163, 166, 173, 0.5);}
//组件
.el-header, .el-main.nopadding, .el-footer {background: var(--el-bg-color-overlay);border-color: var(--el-border-color-light);}
.el-main {background: var(--el-bg-color);}
.el-aside {background: var(--el-bg-color-overlay);border-color: var(--el-border-color-light);}
.el-table .el-table__body-wrapper {background: var(--el-bg-color);}
.el-table th.is-sortable:hover {background: #111;}
}
+91
View File
@@ -0,0 +1,91 @@
/* 覆盖element-plus样式 */
:root {
--el-color-primary: #409EFF;
--el-color-primary-light-1: #53a7ff;
--el-color-primary-light-2: #66b1ff;
--el-color-primary-light-3: #79bbff;
--el-color-primary-light-4: #8cc4ff;
--el-color-primary-light-5: #9fceff;
--el-color-primary-light-6: #b2d8ff;
--el-color-primary-light-7: #c5e1ff;
--el-color-primary-light-8: #d8ebff;
--el-color-primary-light-9: #ebf5ff;
--el-color-primary-dark-1: #398ee5;
--el-color-primary-dark-2: #337ecc;
--el-color-primary-dark-3: #2c6eb2;
--el-color-primary-dark-4: #265e99;
--el-color-primary-dark-5: #204f7f;
--el-color-primary-dark-6: #193f66;
--el-color-primary-dark-7: #132f4c;
--el-color-primary-dark-8: #0c1f32;
--el-color-primary-dark-9: #060f19;
}
.el-menu {border: none!important;}
.el-menu .el-menu-item a {color: inherit;text-decoration: none;display: block;width:100%;height:100%;position: absolute;top:0px;left:0px;}
.el-form-item-msg {font-size: 12px;color: #999;clear: both;width: 100%;}
.el-container {height: 100%;}
.el-aside {border-right: 1px solid var(--el-border-color-light);}
.el-container + .el-aside {border-right: 0;border-left: 1px solid var(--el-border-color-light);}
.el-header {background: #fff;border-bottom: 1px solid var(--el-border-color-light);padding:13px 15px;display: flex;align-items: center;}
.el-header .left-panel {display: flex;align-items: center;}
.el-header .right-panel {display: flex;align-items: center;}
.el-header .right-panel > * + * {margin-left:10px;}
.el-footer {background: #fff;border-top: 1px solid var(--el-border-color-light);padding:13px 15px;}
.el-main {padding:15px;}
.el-main.nopadding {padding:0;background: #fff;}
.el-drawer__body {overflow: auto;padding:0;}
.el-popconfirm__main {margin: 14px 0;}
// .el-card__header {border-bottom: 0;font-size: 17px;font-weight: bold;padding:15px 20px 0px 20px;}
// .el-card__header {padding:5px 20px 5px 20px;}
.el-dialog__title {font-size: 17px;font-weight: bold;}
.el-drawer__header>:first-child {font-size: 17px;font-weight: bold;}
.el-tree.menu .el-tree-node__content {height:36px;}
.el-tree.menu .el-tree-node__content .el-tree-node__label .icon {margin-right: 5px;}
.el-progress__text {font-size: 12px!important;}
.el-progress__text i {font-size: 14.4px!important;}
.el-step.is-horizontal .el-step__line {height:1px;}
.el-step__title {font-size: 14px;}
.drawerBG {background: #f6f8f9;}
.el-button+.el-dropdown {margin-left: 10px;}
.el-button-group+.el-dropdown {margin-left: 10px;}
.el-button-group+.el-button-group {margin-left: 10px;}
.el-tabs__nav-wrap::after {height: 1px;}
.el-table th.is-sortable {transition: .1s;}
.el-table th.is-sortable:hover {background: #eee;}
.el-table .el-table__body-wrapper {background: #f6f8f9;}
.el-col .el-card {margin-bottom: 15px;}
.el-main {flex-basis: 100%;}
.el-main > .scTable .el-table--border::before {display: none;}
.el-main > .scTable .el-table--border::after {display: none;}
.el-main > .scTable .el-table--border .el-table__inner-wrapper::after {display: none;}
.el-main > .scTable .el-table__border-left-patch {display: none;}
.el-main > .scTable .el-table--border .el-table__inner-wrapper tr:first-child td:first-child {border-left: 0;}
.el-main > .scTable .el-table--border .el-table__inner-wrapper tr:first-child th:first-child {border-left: 0;}
.el-table.el-table--large {font-size: 14px;}
.el-table.el-table--small {font-size: 12px;}
.el-table {font-size: 12px;}
.el-radio-button__inner {font-size: 12px;}
.el-checkbox-button__inner {font-size: 12px;}
.el-sub-menu .el-icon {font-size: 17px;}
.el-sub-menu .el-sub-menu__icon-arrow {font-size: 12px;}
.aminui-side-split li.active {background-color: var(--el-color-primary);}
.adminui-tags li:hover {background-color: var(--el-color-primary-light-9);}
.adminui-tags li.active {background-color: var(--el-color-primary)!important;}
.contextmenu li:hover {background-color: var(--el-color-primary-light-9)!important;color: var(--el-color-primary-light-2)!important;}
.data-box .item-background {background-color: var(--el-color-primary)!important;}
.layout-setting,.diy-grid-setting {background-color: var(--el-color-primary)!important;}
/* 全部禁用el-tag动画 */
.el-tag {transition: all 0s !important;}
/* 覆盖tinymce样式 */
.sceditor .tox-tinymce {border: 1px solid #DCDFE6;border-radius: 0;}
body .tox-tinymce-aux {z-index: 5700;}
//新增
.el-table .cell{
word-break: break-word;
}
+174
View File
@@ -0,0 +1,174 @@
@media (max-width: 992px) {
// 移动端样式覆盖
.el-form-item {
display: block;
}
.el-form-item__label {
margin: 5px !important;
}
.el-dialog {
width: 90% !important;
}
.el-dialog.is-fullscreen {
width: 100% !important;
}
.el-drawer.rtl {
width: min(400px, 100%) !important;
}
.el-form-item__content {
margin: 5px !important;
}
// .arrayInput{
// width: 100% !important;
// }
.adminui-main {
>.el-container {
display: block;
height: auto;
}
>.el-container>.el-aside {
width: 100% !important;
border: 0
}
}
.scTable {
.el-table,
.el-table__body-wrapper {
display: block !important;
height: auto !important;
}
.el-scrollbar__wrap {
height: auto !important;
}
.scTable-page {
padding: 0 5px !important;
}
.el-pagination__total,
.el-pagination__jump,
.el-pagination__sizes {
display: none !important;
}
}
.headerPublic {
height: auto !important;
display: block;
.left-panel {
overflow: auto;
}
.left-panel::-webkit-scrollbar {
display: none;
}
.right-panel {
display: block;
border-top: 1px solid var(--el-border-color-light);
margin-top: 15px;
}
.right-panel .right-panel-search {
display: block;
}
.right-panel .right-panel-search>* {
width: 100%;
margin: 0;
margin-top: 15px;
}
}
.adminui-main>.el-container>*:first-child:not(.el-aside):not(.el-header) {
border: 0;
margin-top: 0;
}
.adminui-main>.el-container>*:first-child:not(.el-aside):not(.el-header)+.el-aside {
margin-top: 0;
}
.adminui-main>.el-container>.el-aside {
border-bottom: 1px solid var(--el-border-color-light) !important;
}
.adminui-main>.el-container>.el-container {
border-top: 1px solid var(--el-border-color-light);
border-bottom: 1px solid var(--el-border-color-light);
margin-top: 15px;
}
.adminui-main>.el-container>.el-container+.el-aside {
border-top: 1px solid var(--el-border-color-light);
margin-top: 15px;
}
.adminui-main>.el-container>.el-header {
@extend .headerPublic;
}
.adminui-main>.el-container>.el-main.nopadding {
border-top: 1px solid var(--el-border-color-light);
border-bottom: 1px solid var(--el-border-color-light);
margin-top: 15px;
}
.adminui-main>.el-container>.el-main+.el-aside {
border-left: 0 !important;
border-top: 1px solid var(--el-border-color-light);
margin-top: 15px;
}
.adminui-main>.el-container>.el-footer {
margin-top: 15px;
border-bottom: 1px solid var(--el-border-color-light);
}
.adminui-main>.el-container>.el-container>.el-header {
@extend .headerPublic
}
.adminui-main>.el-container>.el-container>.el-header .left-panel {
display: block;
}
.adminui-main>.el-container>.el-container>.el-header .right-panel {
display: block;
margin-top: 15px;
}
.sc-page {
width: 100%;
margin: 0;
}
.common-main .el-form {
width: 100% !important;
}
.common-header-logo label {
display: none;
}
.common-header-title {
display: none;
}
//手机端没有左右边距 新增
.el-main {
padding: 15px 0px;
}
}
+44
View File
@@ -0,0 +1,44 @@
/* USERCENTER */
.page-user {
.user-info-top {text-align: center;}
.user-info-top h2 {font-size: 18px;margin-top: 5px;}
.user-info-top p {margin: 8px 0 10px 0;}
.menu {background: none;}
.menu .el-menu-item {font-size: 12px;--el-menu-item-height:50px;}
.menu .el-menu-item-group {border-top: 1px solid var(--el-border-color-light);}
.menu .el-menu-item-group:first-child {border: 0;}
}
/*static-table*/
.static-table {border-collapse: collapse;width: 100%;font-size: 14px;margin-bottom: 45px;line-height: 1.5em;}
.static-table th {text-align: left;white-space: nowrap;color: #909399;font-weight: 400;border-bottom: 1px solid #dcdfe6;padding: 15px;max-width: 250px;}
.static-table td {border-bottom: 1px solid #dcdfe6;padding: 15px;max-width: 250px;color: #606266;}
/*header-tabs*/
.header-tabs {padding:10px 0 0 0;display:block;border:0!important;height:50px;background: none;}
.header-tabs .el-tabs__header {padding-left:10px;margin: 0;}
.header-tabs .el-tabs__content {display: none;}
.header-tabs .el-tabs__nav {border-radius: 0 !important;}
.header-tabs .el-tabs__item {font-size: 13px;}
.header-tabs .el-tabs__item.is-active {background-color: var(--el-bg-color-overlay);}
/*common-page*/
.common-page {}
.common-header-left {display: flex;align-items: center;}
.common-header-logo {display: flex;align-items: center;}
.common-header-logo img {height:30px;margin-right: 10px;vertical-align: bottom;}
.common-header-logo label {font-size: 20px;}
.common-header-title {font-size: 16px;border-left: 1px solid var(--el-border-color-light);margin-left: 15px;padding-left: 15px;}
.common-header-right {display: flex;align-items: center;}
.common-header-right a {font-size: 14px;color: var(--el-color-primary);cursor: pointer;}
.common-header-right a:hover {color: var(--el-color-primary-light-3);}
.common-container {max-width: 1240px;margin:30px auto 30px auto;}
.common-main {padding:20px;}
.common-title {font-size: 26px;margin-bottom: 20px;font-weight: normal;}
.common-main .el-form {width: 500px;margin:30px auto;}
.common-main .el-steps .el-step__title {font-size: 14px;}
.common-main .el-steps .el-step__icon {border: 1px solid;}
.common-main .yzm {display: flex;width: 100%;}
.common-main .yzm .el-button {margin-left: 10px;}
.common-main .link {color: var(--el-color-primary);cursor: pointer;}
.common-main .link:hover {color: var(--el-color-primary-light-3);}
+6
View File
@@ -0,0 +1,6 @@
@use 'app.scss';
@use 'fix.scss';
@use 'pages.scss';
@use 'media.scss';
@use 'dark.scss';
@use 'zd.scss';
+48
View File
@@ -0,0 +1,48 @@
.zd-flex-center {
display: flex;
justify-content: center;
align-items: center;
}
.zd-flex-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.zd-flex-column {
display: flex;
flex-direction: column;
}
.zd-padding-0 {
padding: 0px;
}
.zd-padding-1 {
padding: 1px;
}
.zd-padding-2 {
padding: 2px;
}
.zd-padding-3 {
padding: 3px;
}
.zd-padding-5 {
padding: 5px;
}
.zd-padding-8 {
padding: 8px;
}
.zd-padding-10 {
padding: 10px;
}
.zd-aside+.zd-aside {
margin-left: 10px;
}