diff --git a/app/appearance/themes/daylight/theme.css b/app/appearance/themes/daylight/theme.css index d1a0d8939..de60dbdd2 100644 --- a/app/appearance/themes/daylight/theme.css +++ b/app/appearance/themes/daylight/theme.css @@ -188,7 +188,6 @@ /* 数据库 */ --b3-av-gallery-shadow: rgba(0, 0, 0, 0.04) 0px 2px 4px 0px, var(--b3-border-color) 0px 0px 0px 1px; - --b3-av-kanban-content-hover-bg: var(--b3-theme-surface); /* 嵌入块 */ --b3-embed-background: transparent; diff --git a/app/appearance/themes/midnight/theme.css b/app/appearance/themes/midnight/theme.css index a80a1fc36..362f8231f 100644 --- a/app/appearance/themes/midnight/theme.css +++ b/app/appearance/themes/midnight/theme.css @@ -187,7 +187,6 @@ /* 数据库 */ --b3-av-gallery-shadow: rgba(0, 0, 0, 0.04) 0px 2px 4px 0px, var(--b3-border-color) 0px 0px 0px 1px; - --b3-av-kanban-content-hover-bg: var(--b3-theme-surface); /* 嵌入块 */ --b3-embed-background: transparent; diff --git a/app/src/assets/scss/business/_av.scss b/app/src/assets/scss/business/_av.scss index 9f23fb75c..7a8997b7e 100644 --- a/app/src/assets/scss/business/_av.scss +++ b/app/src/assets/scss/business/_av.scss @@ -278,13 +278,18 @@ position: relative; min-height: 40px; - &:hover { - .av__gallery-cover { - background-color: var(--b3-theme-surface-light); - } + &::before { + transition: background 100ms ease-out; + content: ""; + inset: 0; + position: absolute; + border-radius: inherit; + background-color: var(--b3-theme-background); + } - .av__gallery-fields { - background-color: var(--b3-theme-surface); + &:hover { + &:not(.av__gallery-item--select)::before { + background-color: var(--b3-theme-surface-light); } .av__gallery-actions { @@ -292,22 +297,16 @@ } } - &--select:before { - content: ""; - background-color: var(--b3-theme-primary-lightest); - height: 100%; - width: 100%; - z-index: 1; - position: absolute; + &--select::before { + background-color: var(--b3-theme-primary-lightest) !important; + opacity: 1 !important; } } &-cover { border-bottom: 1px solid var(--b3-border-color); - background-color: var(--b3-theme-surface); border-radius: var(--b3-border-radius) var(--b3-border-radius) 0 0; overflow: hidden; - transition: background 100ms ease-out; position: relative; cursor: pointer; @@ -376,9 +375,8 @@ } &-fields { - border-radius: var(--b3-border-radius); + border-radius: 0 0 var(--b3-border-radius) var(--b3-border-radius); flex: 1; - transition: background 100ms ease-out; white-space: nowrap; font-size: 85%; min-height: 23px; @@ -430,10 +428,6 @@ } } - &-cover + &-fields { - border-radius: 0 0 var(--b3-border-radius) var(--b3-border-radius); - } - &-field { position: relative; } @@ -492,7 +486,7 @@ position: relative; &:hover { - background-color: var(--b3-list-hover); + background-color: var(--b3-theme-surface-light); color: var(--b3-theme-on-background); } } @@ -1010,6 +1004,58 @@ display: flex; align-items: flex-start; + &--bg { + .av__kanban-group::before { + content: ""; + position: absolute; + inset: 0; + background-color: var(--b3-av-kanban-background); + opacity: 0.16; + border-radius: inherit; + } + + .av__gallery-item { + position: relative; + box-shadow: rgba(0, 0, 0, 0.04) 0 2px 4px 0, var(--b3-av-kanban-background) 0 0 0 1px; + + &::before { + background-color: var(--b3-av-kanban-background); + opacity: 0.26; + } + + &:hover:not(.av__gallery-item--select)::before { + background-color: var(--b3-av-kanban-background); + opacity: 0.38; + } + } + + .av__gallery-cover { + border-bottom-color: var(--b3-av-kanban-background); + } + + .av__gallery-add { + box-shadow: rgba(0, 0, 0, 0.04) 0 2px 4px 0, var(--b3-av-kanban-background) 0 0 0 1px; + + &::before { + content: ""; + position: absolute; + inset: 0; + background-color: var(--b3-av-kanban-background); + border-radius: inherit; + opacity: 0.26; + } + + &:hover { + background-color: transparent; + + &::before { + background-color: var(--b3-av-kanban-background); + opacity: 0.38; + } + } + } + } + &-group { width: 260px; padding: 8px; @@ -1017,23 +1063,6 @@ position: relative; flex-shrink: 0; - &::before { - content: ""; - position: absolute; - inset: 0; - background-color: var(--b3-av-kanban-border); - opacity: 0.161; - border-radius: inherit; - pointer-events: none; - z-index: 0; - } - - &:hover { - .av__group-icon { - opacity: 1; - } - } - &--small { width: 180px; } @@ -1042,91 +1071,9 @@ width: 320px; } - .av__group-icon { - opacity: 0; - } - .av__group-title { padding-top: 0; } - - .av__gallery-item { - position: relative; - box-shadow: rgba(0, 0, 0, 0.04) 0 2px 4px 0, var(--b3-av-kanban-border, var(--b3-border-color)) 0 0 0 1px; - - &::before { - content: ""; - position: absolute; - inset: 0; - background-color: var(--b3-av-kanban-border); - opacity: 0.278; - border-radius: inherit; - pointer-events: none; - z-index: 0; - } - - &--select::before { - content: ""; - position: absolute; - inset: 0; - background-color: var(--b3-theme-primary-lighter); - border-radius: inherit; - pointer-events: none; - z-index: 1; - } - - // 禁用父级 hover 规则对背景色的改变,避免与 ::before 伪元素冲突 - &:hover { - .av__gallery-cover { - background-color: var(--b3-theme-surface); - } - - .av__gallery-fields { - background-color: transparent; - } - } - - .av__gallery-fields, - .av__gallery-cover { - position: relative; - - &::before { - content: ""; - position: absolute; - inset: 0; - background-color: transparent; - opacity: 0.361; - border-radius: inherit; - pointer-events: none; - z-index: 0; - transition: background-color 100ms ease-out; - } - } - - &:hover .av__gallery-fields, - &:hover .av__gallery-cover { - &::before { - background-color: var(--b3-av-kanban-content-hover-bg); - opacity: 0.65; - } - } - } - - .av__gallery-cover { - position: relative; - border-bottom: 1px solid var(--b3-av-kanban-border); - - &::before { - content: ""; - position: absolute; - inset: 0; - background-color: var(--b3-av-kanban-border); - opacity: 0.278; - border-radius: inherit; - pointer-events: none; - z-index: 0; - } - } } } } diff --git a/app/src/protyle/render/av/kanban/render.ts b/app/src/protyle/render/av/kanban/render.ts index 7171f8620..632879753 100644 --- a/app/src/protyle/render/av/kanban/render.ts +++ b/app/src/protyle/render/av/kanban/render.ts @@ -31,7 +31,7 @@ const getKanbanTitleHTML = (group: IAVView, counter: number) => { ${nameHTML} ${counter === 0 ? '' : `${counter}`} - + `; }; @@ -198,18 +198,22 @@ export const renderKanban = async (options: { }); return; } - const view: IAVGallery = data.view as IAVKanban; + const view = data.view as IAVKanban; let bodyHTML = ""; + let isSelectGroup = false; view.groups.forEach((group: IAVKanban) => { if (group.groupHidden === 0) { let selectBg = ""; - if (group.fillColBackgroundColor && ["mSelect", "select"].includes(group.groupKey.type)) { - if (group.groupValue.mSelect) { - // 单选多选字段分组使用选项颜色 - selectBg = `style="--b3-av-kanban-border: var(--b3-font-background${group.groupValue.mSelect[0].color}); --b3-av-kanban-content-hover-bg: var(--b3-av-kanban-border);"`; - } else { - // _@default@_ 分组使用 var(--b3-border-color) - selectBg = 'style="--b3-av-kanban-border: var(--b3-border-color); --b3-av-kanban-content-hover-bg: var(--b3-av-kanban-border);"'; + if (group.fillColBackgroundColor) { + if (["mSelect", "select"].includes(group.groupValue.type)) { + isSelectGroup = true; + } + if (isSelectGroup) { + if (group.groupValue.mSelect && group.groupValue.mSelect.length > 0) { + selectBg = `style="--b3-av-kanban-background: var(--b3-font-background${group.groupValue.mSelect[0].color});"`; + } else { + selectBg = 'style="--b3-av-kanban-background: var(--b3-border-color);"'; + } } } bodyHTML += `
@@ -221,13 +225,19 @@ export const renderKanban = async (options: { if (options.renderAll) { options.blockElement.firstElementChild.outerHTML = `
${genTabHeaderHTML(data, resetData.isSearching || !!resetData.query, !options.protyle.disabled && !hasClosestByAttribute(options.blockElement, "data-type", "NodeBlockQueryEmbed"))} -
+
${bodyHTML}
${Constants.ZWSP}
`; } else { - options.blockElement.querySelector(".av__kanban").innerHTML = bodyHTML; + const kanbanElement = options.blockElement.querySelector(".av__kanban"); + kanbanElement.innerHTML = bodyHTML; + if (isSelectGroup) { + kanbanElement.classList.add("av__kanban--bg"); + } else { + kanbanElement.classList.remove("av__kanban--bg"); + } } afterRenderGallery({ resetData, diff --git a/app/src/protyle/render/av/render.ts b/app/src/protyle/render/av/render.ts index 079fc04ab..093653989 100644 --- a/app/src/protyle/render/av/render.ts +++ b/app/src/protyle/render/av/render.ts @@ -727,19 +727,23 @@ export const refreshAV = (protyle: IProtyle, operation: IOperation) => { } if (operation.action === "setAttrViewFillColBackgroundColor") { getAVElements(protyle, operation.avID, operation.viewID).forEach((avItem: HTMLElement) => { + const hasSelect = avItem.querySelector(".av__group-title .b3-chip"); + const kanbanElement = avItem.querySelector(".av__kanban"); + if (operation.data && hasSelect) { + kanbanElement.classList.add("av__kanban--bg"); + } else { + kanbanElement.classList.remove("av__kanban--bg"); + } avItem.querySelectorAll(".av__kanban-group").forEach(item => { - if (!operation.data) { - item.removeAttribute("style"); - return; - } - const nameElement = item.querySelector(".av__group-title .b3-chip") as HTMLElement; - if (nameElement) { - const colorMatch = nameElement.style.backgroundColor.match(/--b3-font-background(\d+)/); - if (colorMatch) { - item.setAttribute("style", `--b3-av-kanban-border: var(--b3-font-background${colorMatch[1]}); --b3-av-kanban-content-hover-bg: var(--b3-av-kanban-border);`); + if (operation.data && hasSelect) { + const nameElement = item.querySelector(".av__group-title .b3-chip") as HTMLElement; + if (nameElement) { + item.setAttribute("style", `--b3-av-kanban-background:var(--b3-font-background${nameElement.style.backgroundColor.slice(-2, -1)})`); + } else { + item.setAttribute("style", "--b3-av-kanban-background: var(--b3-border-color)"); } } else { - item.setAttribute("style", "--b3-av-kanban-border: var(--b3-border-color); --b3-av-kanban-content-hover-bg: var(--b3-av-kanban-border);"); + item.removeAttribute("style"); } }); }); diff --git a/app/src/protyle/util/editorCommonEvent.ts b/app/src/protyle/util/editorCommonEvent.ts index 56269d4b0..c6bae428e 100644 --- a/app/src/protyle/util/editorCommonEvent.ts +++ b/app/src/protyle/util/editorCommonEvent.ts @@ -602,7 +602,7 @@ export const dropEvent = (protyle: IProtyle, editorElement: HTMLElement) => { ghostElement.className = "protyle-wysiwyg protyle-wysiwyg--attr"; const isKanban = blockElement.getAttribute("data-av-type") === "kanban"; if (isKanban) { - ghostElement.innerHTML = "
"; + ghostElement.innerHTML = `
`; } let galleryElement: HTMLElement; let cloneGalleryElement = document.createElement("div"); @@ -614,7 +614,7 @@ export const dropEvent = (protyle: IProtyle, editorElement: HTMLElement) => { if (isKanban) { cloneGalleryElement.className = "av__kanban-group"; cloneGalleryElement.setAttribute("style", item.parentElement.parentElement.parentElement.getAttribute("style") || "--b3-av-kanban-content-bg: var(--b3-theme-background);"); - cloneGalleryElement.innerHTML = "
"; + cloneGalleryElement.innerHTML = ''; ghostElement.firstElementChild.appendChild(cloneGalleryElement); } else { cloneGalleryElement.classList.add("av__gallery"); @@ -628,11 +628,10 @@ export const dropEvent = (protyle: IProtyle, editorElement: HTMLElement) => { if (isKanban) { cloneGalleryElement.firstElementChild.appendChild(cloneItem); } else { - cloneItem.querySelector(".av__gallery-fields").setAttribute("style", "background-color: var(--b3-theme-background)"); cloneGalleryElement.appendChild(cloneItem); } }); - ghostElement.setAttribute("style", "top:100vh;position:fixed;opacity:.1;padding:0;z-index: 8"); + ghostElement.setAttribute("style", "left: 1px;top:100vh;position:fixed;opacity:.1;padding:0;z-index: 8"); document.body.append(ghostElement); event.dataTransfer.setDragImage(ghostElement, -10, -10); setTimeout(() => {