Files
lsky-pro-docker/src/resources/css/context-js.less
T
mole404 30862d602f feat(图片页 1/2): 详细信息与移动到相册改用居中卡片弹窗、二级菜单返回键加空隙
#1 「详细信息」「移动到相册」弃用右侧抽屉,改复用 x-modal 的居中卡片弹窗(新增
   #image-detail-modal / #image-movements-modal 及其内容容器,三个新模板):
   - 详细信息:顶部小缩略图 + dl 行式布局(<640px 自动上下堆叠),标签 13px / 值 14px /
     leading-6;字段顺序按老师要求 = 上传时间 → 图片名称 → 其余 10 项(原抽屉里 12 项一个没删,
     只换位置);弹窗内不放复制链接/下载/删除(单一职责)。
   - 移动到相册:单选列表(当前所在相册带「当前」徽标)、行 min-h-[44px](手机点击区)、
     未选中时「移动」disabled;请求逐字沿用原实现(同 route user.images.movement、同 payload);
     点「移动」才提交,成功关弹窗 + resetImages + toastr。
   - 右侧抽屉保留本职(工具栏「相册列表」入口、自带无限加载、相册增删改查)原样不动;
     桌面右键、手机长按、工具栏三个入口都走新弹窗。
#2 二级菜单「<返回」箭头与文字间距:context-js.less 加 7px(选择器权重压过标记自带 mr-1)。

关键:本轮的 images.blade.php 改动不属于补丁文件(context-js.js 两份 md5 全程 = Dockerfile 钉住的
b916555a…,未动),Dockerfile 的 images_blade_md5 已随自证同步更新为 27bb3f20…,补丁重生成 2563 行
且「打回上游 = 仓库文件」字节一致。

验证:四套回归我自己跑过 —— longpress 79/79、sidebar 6/6、images-modal 35/35(静态契约:
12 字段与顺序 / 13-14px 字号 / min-h-44 / 请求不变 / 无硬编码色 / 返回键 7px / 补丁 md5 未变)、
images-modal-dom 35/35(jsdom 真跑页面内联脚本:点菜单 → 内容进新弹窗、抽屉全程为空且未被推开、
单选互斥、点「移动」实发 {selected,id,album_id} 后关弹窗、抽屉路径仍能筛选相册);
php -l + view:cache exit 0;重建产物含 text-[13px]/[14px]/min-h-[44px]/max-h-[50vh]/ls-badge 等。
2026-09-29 14:34:25 +08:00

234 lines
5.5 KiB
Plaintext

.nav-header {
display: block;
padding: 3px 15px;
font-size: 12.5px;
font-weight: bold;
line-height: 20px;
color: var(--lsky-text-3);
text-shadow: none;
text-transform: uppercase;
}
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 1000;
display: none;
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0;
list-style: none;
background-color: var(--lsky-surface);
border: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
border-radius: 6px;
box-shadow: var(--lsky-shadow-pop);
background-clip: padding-box;
text-align: left;
&.pull-right {
right: 0;
left: auto;
}
.divider {
height: 1px;
margin: 9px 1px;
overflow: hidden;
background-color: var(--lsky-surface-3);
border-bottom: 1px solid var(--lsky-border);
}
a {
display: block;
padding: 5px 20px;
clear: both;
font-weight: normal;
line-height: 20px;
color: var(--lsky-text);
white-space: nowrap;
text-decoration: none;
}
.disabled {
& > a {
&:hover {
text-decoration: none;
cursor: default;
background-color: transparent;
}
}
}
li > a:hover, li > a:focus, .dropdown-submenu:hover > a {
color: #ffffff;
text-decoration: none;
background-color: var(--lsky-accent);
background-image: none;
background-repeat: repeat-x;
}
.active > a, .active > a:hover {
color: #ffffff;
text-decoration: none;
background-color: var(--lsky-accent);
background-image: none;
background-repeat: repeat-x;
outline: 0;
}
.disabled > a, .disabled > a:hover {
color: var(--lsky-text-3);
}
.open {
*z-index: 1000;
& > .dropdown-menu {
display: block;
}
}
.pull-right {
& > .dropdown-menu {
right: 0;
left: auto;
}
}
}
.dropup .caret, .navbar-fixed-bottom .dropdown .caret {
border-top: 0;
border-bottom: 4px solid var(--lsky-border-2);
content: "\2191";
}
.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 1px;
}
.dropdown-submenu {
position: relative;
& > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
&.drop-left {
left: -100%;
}
}
&:hover {
.dropdown-menu {
display: block;
}
& > a {
&:after {
border-left-color: var(--lsky-surface);
}
}
}
& > a {
&:after {
display: block;
float: right;
width: 0;
height: 0;
margin-top: 5px;
margin-right: -10px;
border-color: transparent;
border-left-color: var(--lsky-border-2);
border-style: solid;
border-width: 5px 0 5px 5px;
content: " ";
}
}
}
.dropdown {
.dropdown-menu {
.nav-header {
padding-right: 20px;
padding-left: 20px;
}
}
}
/**
* Context Styles
*/
.dropdown-context {
.nav-header {
cursor: default;
}
.dropdown-submenu {
&:hover {
.dropdown-menu {
display: none;
}
& > .dropdown-menu {
display: block;
}
}
}
}
/* 手机端二级菜单「就地展开」时,顶部那行「< 返回」里的箭头与文字贴在一起很难看:
箭头是图标(fas fa-chevron-left,标记里自带 mr-1 ≈ 4px),这里统一补到 7px 间距。
三条类选择器的权重高于工具类 .mr-1,所以不依赖 CSS 打包顺序;其余样式一个字没动。 */
.dropdown-context .submenu-back > a > i {
margin-right: 7px;
}
.dropdown-context:before, .dropdown-context-up:before {
position: absolute;
top: -7px;
left: 9px;
display: inline-block;
border-right: 7px solid transparent;
border-bottom: 7px solid var(--lsky-border-2);
border-left: 7px solid transparent;
border-bottom-color: rgba(0, 0, 0, 0.2);
content: '';
}
.dropdown-context:after, .dropdown-context-up:after {
position: absolute;
top: -6px;
left: 10px;
display: inline-block;
border-right: 6px solid transparent;
border-bottom: 6px solid var(--lsky-surface);
border-left: 6px solid transparent;
content: '';
}
.dropdown-context-up:before, .dropdown-context-up:after {
top: auto;
bottom: -7px;
z-index: 9999;
}
.dropdown-context-up {
&:before {
border-right: 7px solid transparent;
border-top: 7px solid var(--lsky-border-2);
border-bottom: none;
border-left: 7px solid transparent;
}
&:after {
border-right: 6px solid transparent;
border-top: 6px solid var(--lsky-surface);
border-left: 6px solid transparent;
border-bottom: none;
}
}
.dropdown-context-sub:before, .dropdown-context-sub:after {
display: none;
}
.compressed-context {
a {
padding-left: 14px;
padding-top: 0;
padding-bottom: 0;
font-size: 13.5px;
}
.divider {
margin: 5px 1px;
}
.nav-header {
padding: 1px 13px;
}
}