diff --git a/app/src/assets/scss/component/_typography.scss b/app/src/assets/scss/component/_typography.scss index 7e4ac9190..d44b0153f 100644 --- a/app/src/assets/scss/component/_typography.scss +++ b/app/src/assets/scss/component/_typography.scss @@ -161,20 +161,20 @@ display: flex; flex-direction: column; - &[data-subtype="NOTE"] { - &::before { - background-color: var(--b3-theme-primary); - } + // NOTE + &::before { + background-color: var(--b3-theme-primary); + } - .callout-info { - color: var(--b3-theme-primary); - } + .callout-info { + color: var(--b3-theme-primary); } &[data-subtype="WARNING"] { &::before { background-color: var(--b3-callout-warning); } + .callout-info { color: var(--b3-callout-warning); } @@ -184,6 +184,7 @@ &::before { background-color: var(--b3-theme-success); } + .callout-info { color: var(--b3-theme-success); } @@ -193,6 +194,7 @@ &::before { background-color: var(--b3-callout-important); } + .callout-info { color: var(--b3-callout-important); } @@ -202,6 +204,7 @@ &::before { background-color: var(--b3-theme-error); } + .callout-info { color: var(--b3-theme-error); } @@ -229,6 +232,8 @@ margin-left: 8px; font-weight: 500; font-size: 114%; + opacity: .86; + transition: var(--b3-color-transition); } } diff --git a/app/src/assets/scss/protyle/_wysiwyg.scss b/app/src/assets/scss/protyle/_wysiwyg.scss index 1ead82a3a..1f60de26b 100644 --- a/app/src/assets/scss/protyle/_wysiwyg.scss +++ b/app/src/assets/scss/protyle/_wysiwyg.scss @@ -793,6 +793,14 @@ background-color: var(--b3-list-hover); } } + + .callout-title { + cursor: pointer; + + &:hover { + opacity: 1; + } + } } .protyle-wysiwyg:not([contenteditable]), diff --git a/app/src/protyle/wysiwyg/callout.ts b/app/src/protyle/wysiwyg/callout.ts new file mode 100644 index 000000000..ea85a10b9 --- /dev/null +++ b/app/src/protyle/wysiwyg/callout.ts @@ -0,0 +1,80 @@ +import {hasClosestBlock} from "../util/hasClosest"; +import {updateTransaction} from "./transaction"; +import {focusBlock} from "../util/selection"; +import {Dialog} from "../../dialog"; +import {escapeHtml} from "../../util/escape"; +import {Menu} from "../../plugin/Menu"; + +export const updateCalloutType = (titleElement: HTMLElement, protyle: IProtyle) => { + const blockElement = hasClosestBlock(titleElement); + if (!blockElement) { + return; + } + const dialog = new Dialog({ + title: window.siyuan.languages.callout, + content: `