diff --git a/.idea/工程代码.iml b/.idea/工程代码.iml
index 24643cc..23a6ace 100644
--- a/.idea/工程代码.iml
+++ b/.idea/工程代码.iml
@@ -5,6 +5,8 @@
+
+
diff --git a/admin-ui/dist.zip b/admin-ui/dist.zip
deleted file mode 100644
index f20d132..0000000
Binary files a/admin-ui/dist.zip and /dev/null differ
diff --git a/portal-ui/dist.zip b/portal-ui/dist.zip
deleted file mode 100644
index b3ac661..0000000
Binary files a/portal-ui/dist.zip and /dev/null differ
diff --git a/portal-ui/src/assets/styles/quill.bubble.css b/portal-ui/src/assets/styles/quill.bubble.css
index 7445b66..be73178 100644
--- a/portal-ui/src/assets/styles/quill.bubble.css
+++ b/portal-ui/src/assets/styles/quill.bubble.css
@@ -7,4 +7,4 @@
*/
.ql-container{box-sizing:border-box;font-family:Helvetica,Arial,sans-serif;font-size:13px;height:100%;margin:0;position:relative}.ql-container.ql-disabled .ql-tooltip{visibility:hidden}.ql-container:not(.ql-disabled) li[data-list=checked] > .ql-ui,.ql-container:not(.ql-disabled) li[data-list=unchecked] > .ql-ui{cursor:pointer}.ql-clipboard{left:-100000px;height:1px;overflow-y:hidden;position:absolute;top:50%}.ql-clipboard p{margin:0;padding:0}.ql-editor{box-sizing:border-box;counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;line-height:1.42;height:100%;outline:none;overflow-y:auto;padding:12px 15px;tab-size:4;-moz-tab-size:4;text-align:left;white-space:pre-wrap;word-wrap:break-word}.ql-editor > *{cursor:text}.ql-editor p,.ql-editor ol,.ql-editor pre,.ql-editor blockquote,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin:0;padding:0}@supports (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-set:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor p,.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{counter-reset:list-0 list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor table{border-collapse:collapse}.ql-editor td{border:1px solid #000;padding:2px 5px}.ql-editor ol{padding-left:1.5em}.ql-editor li{list-style-type:none;padding-left:1.5em;position:relative}.ql-editor li > .ql-ui:before{display:inline-block;margin-left:-1.5em;margin-right:.3em;text-align:right;white-space:nowrap;width:1.2em}.ql-editor li[data-list=checked] > .ql-ui,.ql-editor li[data-list=unchecked] > .ql-ui{color:#777}.ql-editor li[data-list=bullet] > .ql-ui:before{content:'\2022'}.ql-editor li[data-list=checked] > .ql-ui:before{content:'\2611'}.ql-editor li[data-list=unchecked] > .ql-ui:before{content:'\2610'}@supports (counter-set:none){.ql-editor li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list]{counter-reset:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered]{counter-increment:list-0}.ql-editor li[data-list=ordered] > .ql-ui:before{content:counter(list-0, decimal) '. '}.ql-editor li[data-list=ordered].ql-indent-1{counter-increment:list-1}.ql-editor li[data-list=ordered].ql-indent-1 > .ql-ui:before{content:counter(list-1, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-set:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-1{counter-reset:list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-2{counter-increment:list-2}.ql-editor li[data-list=ordered].ql-indent-2 > .ql-ui:before{content:counter(list-2, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-set:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-2{counter-reset:list-3 list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-3{counter-increment:list-3}.ql-editor li[data-list=ordered].ql-indent-3 > .ql-ui:before{content:counter(list-3, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-set:list-4 list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-3{counter-reset:list-4 list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-4{counter-increment:list-4}.ql-editor li[data-list=ordered].ql-indent-4 > .ql-ui:before{content:counter(list-4, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-set:list-5 list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-4{counter-reset:list-5 list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-5{counter-increment:list-5}.ql-editor li[data-list=ordered].ql-indent-5 > .ql-ui:before{content:counter(list-5, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-set:list-6 list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-5{counter-reset:list-6 list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-6{counter-increment:list-6}.ql-editor li[data-list=ordered].ql-indent-6 > .ql-ui:before{content:counter(list-6, decimal) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-set:list-7 list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-6{counter-reset:list-7 list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-7{counter-increment:list-7}.ql-editor li[data-list=ordered].ql-indent-7 > .ql-ui:before{content:counter(list-7, lower-alpha) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-set:list-8 list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-7{counter-reset:list-8 list-9}}.ql-editor li[data-list=ordered].ql-indent-8{counter-increment:list-8}.ql-editor li[data-list=ordered].ql-indent-8 > .ql-ui:before{content:counter(list-8, lower-roman) '. '}@supports (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-set:list-9}}@supports not (counter-set:none){.ql-editor li[data-list].ql-indent-8{counter-reset:list-9}}.ql-editor li[data-list=ordered].ql-indent-9{counter-increment:list-9}.ql-editor li[data-list=ordered].ql-indent-9 > .ql-ui:before{content:counter(list-9, decimal) '. '}.ql-editor .ql-indent-1:not(.ql-direction-rtl){padding-left:3em}.ql-editor li.ql-indent-1:not(.ql-direction-rtl){padding-left:4.5em}.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:3em}.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right{padding-right:4.5em}.ql-editor .ql-indent-2:not(.ql-direction-rtl){padding-left:6em}.ql-editor li.ql-indent-2:not(.ql-direction-rtl){padding-left:7.5em}.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:6em}.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right{padding-right:7.5em}.ql-editor .ql-indent-3:not(.ql-direction-rtl){padding-left:9em}.ql-editor li.ql-indent-3:not(.ql-direction-rtl){padding-left:10.5em}.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:9em}.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right{padding-right:10.5em}.ql-editor .ql-indent-4:not(.ql-direction-rtl){padding-left:12em}.ql-editor li.ql-indent-4:not(.ql-direction-rtl){padding-left:13.5em}.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:12em}.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right{padding-right:13.5em}.ql-editor .ql-indent-5:not(.ql-direction-rtl){padding-left:15em}.ql-editor li.ql-indent-5:not(.ql-direction-rtl){padding-left:16.5em}.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:15em}.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right{padding-right:16.5em}.ql-editor .ql-indent-6:not(.ql-direction-rtl){padding-left:18em}.ql-editor li.ql-indent-6:not(.ql-direction-rtl){padding-left:19.5em}.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:18em}.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right{padding-right:19.5em}.ql-editor .ql-indent-7:not(.ql-direction-rtl){padding-left:21em}.ql-editor li.ql-indent-7:not(.ql-direction-rtl){padding-left:22.5em}.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:21em}.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right{padding-right:22.5em}.ql-editor .ql-indent-8:not(.ql-direction-rtl){padding-left:24em}.ql-editor li.ql-indent-8:not(.ql-direction-rtl){padding-left:25.5em}.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:24em}.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right{padding-right:25.5em}.ql-editor .ql-indent-9:not(.ql-direction-rtl){padding-left:27em}.ql-editor li.ql-indent-9:not(.ql-direction-rtl){padding-left:28.5em}.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:27em}.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right{padding-right:28.5em}.ql-editor li.ql-direction-rtl{padding-right:1.5em}.ql-editor li.ql-direction-rtl > .ql-ui:before{margin-left:.3em;margin-right:-1.5em;text-align:left}.ql-editor table{table-layout:fixed;width:100%}.ql-editor table td{outline:none}.ql-editor .ql-code-block-container{font-family:monospace}.ql-editor .ql-video{display:block;max-width:100%}.ql-editor .ql-video.ql-align-center{margin:0 auto}.ql-editor .ql-video.ql-align-right{margin:0 0 0 auto}.ql-editor .ql-bg-black{background-color:#000}.ql-editor .ql-bg-red{background-color:#e60000}.ql-editor .ql-bg-orange{background-color:#f90}.ql-editor .ql-bg-yellow{background-color:#ff0}.ql-editor .ql-bg-green{background-color:#008a00}.ql-editor .ql-bg-blue{background-color:#06c}.ql-editor .ql-bg-purple{background-color:#93f}.ql-editor .ql-color-white{color:#fff}.ql-editor .ql-color-red{color:#e60000}.ql-editor .ql-color-orange{color:#f90}.ql-editor .ql-color-yellow{color:#ff0}.ql-editor .ql-color-green{color:#008a00}.ql-editor .ql-color-blue{color:#06c}.ql-editor .ql-color-purple{color:#93f}.ql-editor .ql-font-serif{font-family:Georgia,Times New Roman,serif}.ql-editor .ql-font-monospace{font-family:Monaco,Courier New,monospace}.ql-editor .ql-size-small{font-size:.75em}.ql-editor .ql-size-large{font-size:1.5em}.ql-editor .ql-size-huge{font-size:2.5em}.ql-editor .ql-direction-rtl{direction:rtl;text-align:inherit}.ql-editor .ql-align-center{text-align:center}.ql-editor .ql-align-justify{text-align:justify}.ql-editor .ql-align-right{text-align:right}.ql-editor .ql-ui{position:absolute}.ql-editor.ql-blank::before{color:rgba(0,0,0,0.6);content:attr(data-placeholder);font-style:italic;left:15px;pointer-events:none;position:absolute;right:15px}.ql-bubble.ql-toolbar:after,.ql-bubble .ql-toolbar:after{clear:both;content:'';display:table}.ql-bubble.ql-toolbar button,.ql-bubble .ql-toolbar button{background:none;border:none;cursor:pointer;display:inline-block;float:left;height:24px;padding:3px 5px;width:28px}.ql-bubble.ql-toolbar button svg,.ql-bubble .ql-toolbar button svg{float:left;height:100%}.ql-bubble.ql-toolbar button:active:hover,.ql-bubble .ql-toolbar button:active:hover{outline:none}.ql-bubble.ql-toolbar input.ql-image[type=file],.ql-bubble .ql-toolbar input.ql-image[type=file]{display:none}.ql-bubble.ql-toolbar button:hover,.ql-bubble .ql-toolbar button:hover,.ql-bubble.ql-toolbar button:focus,.ql-bubble .ql-toolbar button:focus,.ql-bubble.ql-toolbar button.ql-active,.ql-bubble .ql-toolbar button.ql-active,.ql-bubble.ql-toolbar .ql-picker-label:hover,.ql-bubble .ql-toolbar .ql-picker-label:hover,.ql-bubble.ql-toolbar .ql-picker-label.ql-active,.ql-bubble .ql-toolbar .ql-picker-label.ql-active,.ql-bubble.ql-toolbar .ql-picker-item:hover,.ql-bubble .ql-toolbar .ql-picker-item:hover,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected{color:#fff}.ql-bubble.ql-toolbar button:hover .ql-fill,.ql-bubble .ql-toolbar button:hover .ql-fill,.ql-bubble.ql-toolbar button:focus .ql-fill,.ql-bubble .ql-toolbar button:focus .ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-fill,.ql-bubble.ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:focus .ql-stroke.ql-fill,.ql-bubble.ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill{fill:#fff}.ql-bubble.ql-toolbar button:hover .ql-stroke,.ql-bubble .ql-toolbar button:hover .ql-stroke,.ql-bubble.ql-toolbar button:focus .ql-stroke,.ql-bubble .ql-toolbar button:focus .ql-stroke,.ql-bubble.ql-toolbar button.ql-active .ql-stroke,.ql-bubble .ql-toolbar button.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,.ql-bubble.ql-toolbar button:hover .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover .ql-stroke-miter,.ql-bubble.ql-toolbar button:focus .ql-stroke-miter,.ql-bubble .ql-toolbar button:focus .ql-stroke-miter,.ql-bubble.ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar button.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,.ql-bubble.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,.ql-bubble .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter{stroke:#fff}@media (pointer:coarse){.ql-bubble.ql-toolbar button:hover:not(.ql-active),.ql-bubble .ql-toolbar button:hover:not(.ql-active){color:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-fill,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill{fill:#ccc}.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke,.ql-bubble.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,.ql-bubble .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter{stroke:#ccc}}.ql-bubble{box-sizing:border-box}.ql-bubble *{box-sizing:border-box}.ql-bubble .ql-hidden{display:none}.ql-bubble .ql-out-bottom,.ql-bubble .ql-out-top{visibility:hidden}.ql-bubble .ql-tooltip{position:absolute;transform:translateY(10px)}.ql-bubble .ql-tooltip a{cursor:pointer;text-decoration:none}.ql-bubble .ql-tooltip.ql-flip{transform:translateY(-10px)}.ql-bubble .ql-formats{display:inline-block;vertical-align:middle}.ql-bubble .ql-formats:after{clear:both;content:'';display:table}.ql-bubble .ql-stroke{fill:none;stroke:#ccc;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ql-bubble .ql-stroke-miter{fill:none;stroke:#ccc;stroke-miterlimit:10;stroke-width:2}.ql-bubble .ql-fill,.ql-bubble .ql-stroke.ql-fill{fill:#ccc}.ql-bubble .ql-empty{fill:none}.ql-bubble .ql-even{fill-rule:evenodd}.ql-bubble .ql-thin,.ql-bubble .ql-stroke.ql-thin{stroke-width:1}.ql-bubble .ql-transparent{opacity:.4}.ql-bubble .ql-direction svg:last-child{display:none}.ql-bubble .ql-direction.ql-active svg:last-child{display:inline}.ql-bubble .ql-direction.ql-active svg:first-child{display:none}.ql-bubble .ql-editor h1{font-size:2em}.ql-bubble .ql-editor h2{font-size:1.5em}.ql-bubble .ql-editor h3{font-size:1.17em}.ql-bubble .ql-editor h4{font-size:1em}.ql-bubble .ql-editor h5{font-size:.83em}.ql-bubble .ql-editor h6{font-size:.67em}.ql-bubble .ql-editor a{text-decoration:underline}.ql-bubble .ql-editor blockquote{border-left:4px solid #ccc;margin-bottom:5px;margin-top:5px;padding-left:16px}.ql-bubble .ql-editor code,.ql-bubble .ql-editor .ql-code-block-container{background-color:#f0f0f0;border-radius:3px}.ql-bubble .ql-editor .ql-code-block-container{margin-bottom:5px;margin-top:5px;padding:5px 10px}.ql-bubble .ql-editor code{font-size:85%;padding:2px 4px}.ql-bubble .ql-editor .ql-code-block-container{background-color:#23241f;color:#f8f8f2;overflow:visible}.ql-bubble .ql-editor img{max-width:100%}.ql-bubble .ql-picker{color:#ccc;display:inline-block;float:left;font-size:14px;font-weight:500;height:24px;position:relative;vertical-align:middle}.ql-bubble .ql-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:2px;position:relative;width:100%}.ql-bubble .ql-picker-label::before{display:inline-block;line-height:22px}.ql-bubble .ql-picker-options{background-color:#444;display:none;min-width:100%;padding:4px 8px;position:absolute;white-space:nowrap}.ql-bubble .ql-picker-options .ql-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px}.ql-bubble .ql-picker.ql-expanded .ql-picker-label{color:#777;z-index:2}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#777}.ql-bubble .ql-picker.ql-expanded .ql-picker-options{display:block;margin-top:-1px;top:100%;z-index:1}.ql-bubble .ql-color-picker,.ql-bubble .ql-icon-picker{width:28px}.ql-bubble .ql-color-picker .ql-picker-label,.ql-bubble .ql-icon-picker .ql-picker-label{padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-label svg,.ql-bubble .ql-icon-picker .ql-picker-label svg{right:4px}.ql-bubble .ql-icon-picker .ql-picker-options{padding:4px 0}.ql-bubble .ql-icon-picker .ql-picker-item{height:24px;width:24px;padding:2px 4px}.ql-bubble .ql-color-picker .ql-picker-options{padding:3px 5px;width:152px}.ql-bubble .ql-color-picker .ql-picker-item{border:1px solid transparent;float:left;height:16px;margin:2px;padding:0;width:16px}.ql-bubble .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before{content:attr(data-label)}.ql-bubble .ql-picker.ql-header{width:98px}.ql-bubble .ql-picker.ql-header .ql-picker-label::before,.ql-bubble .ql-picker.ql-header .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{content:'Heading 1'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{content:'Heading 2'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{content:'Heading 3'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{content:'Heading 4'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{content:'Heading 5'}.ql-bubble .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{content:'Heading 6'}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="1"]::before{font-size:2em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="2"]::before{font-size:1.5em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="3"]::before{font-size:1.17em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="4"]::before{font-size:1em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="5"]::before{font-size:.83em}.ql-bubble .ql-picker.ql-header .ql-picker-item[data-value="6"]::before{font-size:.67em}.ql-bubble .ql-picker.ql-font{width:108px}.ql-bubble .ql-picker.ql-font .ql-picker-label::before,.ql-bubble .ql-picker.ql-font .ql-picker-item::before{content:'Sans Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{content:'Serif'}.ql-bubble .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{content:'Monospace'}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=serif]::before{font-family:Georgia,Times New Roman,serif}.ql-bubble .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before{font-family:Monaco,Courier New,monospace}.ql-bubble .ql-picker.ql-size{width:98px}.ql-bubble .ql-picker.ql-size .ql-picker-label::before,.ql-bubble .ql-picker.ql-size .ql-picker-item::before{content:'Normal'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=small]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{content:'Small'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=large]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{content:'Large'}.ql-bubble .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{content:'Huge'}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=small]::before{font-size:10px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=large]::before{font-size:18px}.ql-bubble .ql-picker.ql-size .ql-picker-item[data-value=huge]::before{font-size:32px}.ql-bubble .ql-color-picker.ql-background .ql-picker-item{background-color:#fff}.ql-bubble .ql-color-picker.ql-color .ql-picker-item{background-color:#000}.ql-code-block-container{position:relative}.ql-code-block-container .ql-ui{right:5px;top:5px}.ql-bubble .ql-toolbar .ql-formats{margin:8px 12px 8px 0}.ql-bubble .ql-toolbar .ql-formats:first-child{margin-left:12px}.ql-bubble .ql-color-picker svg{margin:1px}.ql-bubble .ql-color-picker .ql-picker-item.ql-selected,.ql-bubble .ql-color-picker .ql-picker-item:hover{border-color:#fff}.ql-bubble .ql-tooltip{background-color:#444;border-radius:25px;color:#fff}.ql-bubble .ql-tooltip-arrow{border-left:6px solid transparent;border-right:6px solid transparent;content:" ";display:block;left:50%;margin-left:-6px;position:absolute}.ql-bubble .ql-tooltip:not(.ql-flip) .ql-tooltip-arrow{border-bottom:6px solid #444;top:-6px}.ql-bubble .ql-tooltip.ql-flip .ql-tooltip-arrow{border-top:6px solid #444;bottom:-6px}.ql-bubble .ql-tooltip.ql-editing .ql-tooltip-editor{display:block}.ql-bubble .ql-tooltip.ql-editing .ql-formats{visibility:hidden}.ql-bubble .ql-tooltip-editor{display:none}.ql-bubble .ql-tooltip-editor input[type=text]{background:transparent;border:none;color:#fff;font-size:13px;height:100%;outline:none;padding:10px 20px;position:absolute;width:100%}.ql-bubble .ql-tooltip-editor a{top:10px;position:absolute;right:20px}.ql-bubble .ql-tooltip-editor a:before{color:#ccc;content:"\00D7";font-size:16px;font-weight:bold}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close){position:relative;white-space:nowrap}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before{background-color:#444;border-radius:15px;top:-5px;font-size:12px;color:#fff;content:attr(href);font-weight:normal;overflow:hidden;padding:5px 15px;text-decoration:none;z-index:1}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{border-top:6px solid #444;border-left:6px solid transparent;border-right:6px solid transparent;top:0;content:" ";height:0;width:0}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close)::after{left:0;margin-left:50%;position:absolute;transform:translate(-50%,-100%);transition:visibility 0s ease 200ms;visibility:hidden}.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::before,.ql-container.ql-bubble:not(.ql-disabled) a:not(.ql-close):hover::after{visibility:visible}
-/*# sourceMappingURL=quill.bubble.css.map*/
\ No newline at end of file
+/* Quill bubble styles - source map removed to fix build error */
\ No newline at end of file
diff --git a/portal-ui/src/assets/styles/quill.core.css b/portal-ui/src/assets/styles/quill.core.css
index 8541b2b..e0c219c 100644
--- a/portal-ui/src/assets/styles/quill.core.css
+++ b/portal-ui/src/assets/styles/quill.core.css
@@ -615,4 +615,4 @@
right: 15px
}
-/*# sourceMappingURL=quill.core.css.map*/
\ No newline at end of file
+/* Quill core styles - source map removed to fix build error */
\ No newline at end of file
diff --git a/portal-ui/src/assets/styles/quill.snow.css b/portal-ui/src/assets/styles/quill.snow.css
index 650a402..e777356 100644
--- a/portal-ui/src/assets/styles/quill.snow.css
+++ b/portal-ui/src/assets/styles/quill.snow.css
@@ -1286,4 +1286,4 @@
border: 1px solid #ccc
}
-/*# sourceMappingURL=quill.snow.css.map*/
\ No newline at end of file
+/* Quill snow styles - source map removed to fix build error */
\ No newline at end of file
diff --git a/portal-ui/src/lang/en_US/common.js b/portal-ui/src/lang/en_US/common.js
index fc55fe9..efe9486 100644
--- a/portal-ui/src/lang/en_US/common.js
+++ b/portal-ui/src/lang/en_US/common.js
@@ -143,6 +143,14 @@ export default {
cardNoRequired: 'Please enter card number',
cardNameRequired: 'Please enter cardholder name',
rechargeFailed: 'Recharge failed',
+ // Model selection
+ selectModel: 'Select Model',
+ seedance20: 'Seedance 2.0',
+ seedance20Fast: 'Seedance 2.0 Fast',
+ // Rich text editor
+ insertImage: 'Insert Image',
+ mentionImage: 'Mention Image',
+ noImageToMention: 'No images to mention',
// VM支付相关
vmCardInfo: 'Credit Card Information',
cardNumber: 'Card Number',
@@ -175,5 +183,9 @@ export default {
country: 'Country',
countryPlaceholder: 'Select country',
countryRequired: 'Please select country',
- submit: 'Submit'
+ videoGen: 'Video Generation',
+ uploadFirstImage: 'Upload Reference Image',
+ insertImage: 'Insert Image',
+ submit: 'Submit',
+ cancel: 'Cancel'
}
\ No newline at end of file
diff --git a/portal-ui/src/lang/en_US/route.js b/portal-ui/src/lang/en_US/route.js
index ed15100..c24a4e9 100644
--- a/portal-ui/src/lang/en_US/route.js
+++ b/portal-ui/src/lang/en_US/route.js
@@ -1,11 +1,12 @@
export default {
index: 'Home',
- imageToImage: 'One-click undressing',
+ imageToImage: 'Image-to-Image 1',
imageToImage2: 'Image-to-Image2',
changeFace: 'Swap Face',
changeFaceVideo: 'Swap Video Face',
fastImage: 'Gen Image',
fastVideo: 'Gen Video',
+ videoGen: 'Video Generation',
recharge: 'Quick Recharge',
help: 'Help Center',
moneyInvite: 'Reward Invitation'
diff --git a/portal-ui/src/lang/zh_HK/common.js b/portal-ui/src/lang/zh_HK/common.js
index fd25525..72b01d7 100644
--- a/portal-ui/src/lang/zh_HK/common.js
+++ b/portal-ui/src/lang/zh_HK/common.js
@@ -145,6 +145,14 @@ export default {
cardNoRequired: '請輸入銀行卡號',
cardNameRequired: '請輸入銀行卡姓名',
rechargeFailed: '充值失敗',
+ // 模型选择
+ selectModel: '選擇模型',
+ seedance20: 'Seedance 2.0',
+ seedance20Fast: 'Seedance 2.0 Fast',
+ // 富文本编辑器
+ insertImage: '插入圖片',
+ mentionImage: '引用圖片',
+ noImageToMention: '暫無可引用的圖片',
// VM支付相關
vmCardInfo: '信用卡信息',
cardNumber: '信用卡卡號',
@@ -178,6 +186,9 @@ export default {
country: '國家',
countryPlaceholder: '請選擇國家',
countryRequired: '請選擇國家',
+ videoGen: '視頻生成',
+ uploadFirstImage: '上傳首圖',
+ insertImage: '插入圖片',
submit: '提交',
cancel: '取消'
}
\ No newline at end of file
diff --git a/portal-ui/src/lang/zh_HK/route.js b/portal-ui/src/lang/zh_HK/route.js
index daa151e..797bc58 100644
--- a/portal-ui/src/lang/zh_HK/route.js
+++ b/portal-ui/src/lang/zh_HK/route.js
@@ -6,6 +6,7 @@ export default {
changeFaceVideo: '視頻換臉',
fastImage: '快捷生圖',
fastVideo: '快捷生視頻',
+ videoGen: '視頻生成',
recharge: '快速充值',
help: '幫助中心',
moneyInvite: '有獎邀請'
diff --git a/portal-ui/src/layout/components/User.vue b/portal-ui/src/layout/components/User.vue
index d03a350..4ee2a11 100644
--- a/portal-ui/src/layout/components/User.vue
+++ b/portal-ui/src/layout/components/User.vue
@@ -29,11 +29,12 @@
:title="$t('common.moneyInvite')">
-
+
@@ -67,7 +68,6 @@ import { mapGetters } from 'vuex'
import i18n from '@/lang/i18n'
import Money from './Money.vue'
import UserAccount from './UserAccount.vue'
-import RechargeRecord from './RechargeRecord.vue'
import ResumeRecord from './ResumeRecord.vue'
import RewardRecord from './RewardRecord.vue'
@@ -93,7 +93,6 @@ export default {
Register,
Money,
UserAccount,
- RechargeRecord,
ResumeRecord,
RewardRecord
},
diff --git a/portal-ui/src/main.js b/portal-ui/src/main.js
index c8b3d39..ec6d0af 100644
--- a/portal-ui/src/main.js
+++ b/portal-ui/src/main.js
@@ -9,9 +9,11 @@ import router from './router'
import '@/assets/styles/base.less'
-import '@/assets/styles/quill.bubble.css'
-import '@/assets/styles/quill.core.css'
-import '@/assets/styles/quill.snow.css'
+// Quill 样式 - 临时注释避免 source map 文件缺失导致的构建错误
+// 如果后续需要使用 Quill 富文本编辑器,可取消注释
+// import '@/assets/styles/quill.bubble.css'
+// import '@/assets/styles/quill.core.css'
+// import '@/assets/styles/quill.snow.css'
const app = createApp(App)
app.use(router)
diff --git a/portal-ui/src/router/index.js b/portal-ui/src/router/index.js
index 488c41d..85c72d7 100644
--- a/portal-ui/src/router/index.js
+++ b/portal-ui/src/router/index.js
@@ -69,49 +69,47 @@ export const constantRoutes = [{
permission: "pass",
icon: 'btn_tst'
}
- },
- // {
- // path: 'image-to-image?type=2',
- // name: 'image-to-image2',
- // component: () => import('@/views/Image.vue'),
- // meta: {
- // title: 'imageToImage2',
- // menuItem: true,
- // permission: "pass",
- // icon: 'btn_tst'
- // }
- // }, {
- // path: 'change-face',
- // name: 'change-face',
- // component: () => import('@/views/ChangeFace.vue'),
- // meta: {
- // title: 'changeFace',
- // menuItem: true,
- // permission: "pass",
- // icon: 'btn_yjhl'
- // }
- // }, {
- // path: 'change-face-video',
- // name: 'change-face-video',
- // component: () => import('@/views/ChangeFace.vue'),
- // meta: {
- // title: 'changeFaceVideo',
- // menuItem: true,
- // permission: "pass",
- // icon: 'btn_yjhl'
- // }
- // }, {
- // path: 'fast-image',
- // name: 'fast-image',
- // component: () => import('@/views/FastImage.vue'),
- // meta: {
- // title: 'fastImage',
- // menuItem: true,
- // permission: "pass",
- // icon: 'btn_kjst'
- // }
- // },
- {
+ }, {
+ path: 'image-to-image?type=2',
+ name: 'image-to-image2',
+ component: () => import('@/views/Image.vue'),
+ meta: {
+ title: 'imageToImage2',
+ menuItem: true,
+ permission: "pass",
+ icon: 'btn_tst'
+ }
+ }, {
+ path: 'change-face',
+ name: 'change-face',
+ component: () => import('@/views/ChangeFace.vue'),
+ meta: {
+ title: 'changeFace',
+ menuItem: true,
+ permission: "pass",
+ icon: 'btn_yjhl'
+ }
+ }, {
+ path: 'change-face-video',
+ name: 'change-face-video',
+ component: () => import('@/views/ChangeFace.vue'),
+ meta: {
+ title: 'changeFaceVideo',
+ menuItem: true,
+ permission: "pass",
+ icon: 'btn_yjhl'
+ }
+ }, {
+ path: 'fast-image',
+ name: 'fast-image',
+ component: () => import('@/views/FastImage.vue'),
+ meta: {
+ title: 'fastImage',
+ menuItem: true,
+ permission: "pass",
+ icon: 'btn_kjst'
+ }
+ }, {
path: 'fast-video',
name: 'fast-video',
component: () => import('@/views/FastVideo.vue'),
@@ -121,6 +119,16 @@ export const constantRoutes = [{
permission: "pass",
icon: 'btn_kjsp'
}
+ }, {
+ path: 'video-gen',
+ name: 'video-gen',
+ component: () => import('@/views/VideoGen.vue'),
+ meta: {
+ title: 'videoGen',
+ menuItem: true,
+ permission: "pass",
+ icon: 'btn_video'
+ }
}, {
path: 'recharge',
name: 'recharge',
diff --git a/portal-ui/src/views/FastVideo.vue b/portal-ui/src/views/FastVideo.vue
index b9d91e4..02ae213 100644
--- a/portal-ui/src/views/FastVideo.vue
+++ b/portal-ui/src/views/FastVideo.vue
@@ -81,11 +81,15 @@
-
+
+
+
import { mapGetters } from 'vuex'
+import RichTextEditor from '@/components/RichTextEditor.vue'
+
export default {
data() {
return {
@@ -195,6 +201,7 @@ export default {
firstUrl: '',
lastUrl: '',
text: '',
+ editorContent: '',
interval: null,
videoUrl: null,
videoLoading: false,
@@ -221,9 +228,14 @@ export default {
{ label: 'Seedance 2.0', value: 'ep-20260326165811-dlkth' },
{ label: 'Seedance 2.0 Fast', value: 'ep-20260326170056-dkj9m' }
],
- selectedModel: 'ep-20260326165811-dlkth'
+ selectedModel: 'ep-20260326165811-dlkth',
+ // 已上传的图片列表(用于@功能)
+ uploadedImages: []
}
},
+ components: {
+ RichTextEditor
+ },
beforeUnmount() {
this.destroyInterval()
},
@@ -335,8 +347,25 @@ export default {
// 繁体中文显示 chineseContent,其他语言显示 englishContent
if (this.lang === 'zh_HK') {
return template.chineseContent || template.name || ''
+ }else{
+ return template.englishContent || template.name || ''
+ }
+ },
+ // 处理富文本内容变化
+ handleTextChange(content) {
+ this.editorContent = content
+ // 同步到旧的 text 字段以保持兼容性
+ this.text = content
+ },
+ // 处理上传的图片(用于@功能)
+ handleImageUpload(imageInfo) {
+ if (imageInfo && imageInfo.url) {
+ this.uploadedImages.push({
+ url: imageInfo.url,
+ name: imageInfo.name || 'image'
+ })
}
- return template.englishContent || template.name || ''
+
},
// 确认选择模板
handleConfirmTemplate() {
@@ -496,7 +525,7 @@ export default {
this.generateLoading = true
let params = {
- text: this.text,
+ text: this.editorContent || this.text,
firstUrl: firstImageUrl,
functionType: '21',
model: this.selectedModel // 新增模型参数
@@ -638,6 +667,59 @@ export default {
border-color: rgba(255,255,255,0.1);
}
}
+
+ /* 富文本编辑器样式 */
+ .rich-editor-root {
+ margin-bottom: 20px;
+
+ .toolbar {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 12px;
+ padding: 8px;
+ background-color: #1a1b20;
+ border-radius: 6px;
+ border: 1px solid rgba(255,255,255,0.1);
+
+ .tool-btn {
+ padding: 6px 12px;
+ background-color: rgba(255,255,255,0.05);
+ border: 1px solid rgba(255,255,255,0.1);
+ color: #fff;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 13px;
+
+ &:hover {
+ background-color: rgba(255,255,255,0.1);
+ border-color: rgba(255,255,255,0.2);
+ }
+ }
+ }
+
+ .rich-editor {
+ min-height: 160px;
+ padding: 16px;
+ background-color: #1a1b20;
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: 6px;
+ color: #fff;
+ font-size: 14px;
+ line-height: 1.6;
+ outline: none;
+ resize: none;
+
+ &:focus {
+ border-color: rgb(var(--primary-6));
+ }
+
+ &[data-placeholder]:empty::before {
+ content: attr(data-placeholder);
+ color: #5c5d68;
+ pointer-events: none;
+ }
+ }
+ }
&-title {
display: flex;
align-items: center;
diff --git a/portal-ui/src/views/Image.vue b/portal-ui/src/views/Image.vue
index f10baa8..a623579 100644
--- a/portal-ui/src/views/Image.vue
+++ b/portal-ui/src/views/Image.vue
@@ -74,13 +74,15 @@
-
+
+
+
import { mapGetters } from 'vuex'
+import RichTextEditor from '@/components/RichTextEditor.vue'
export default {
data() {
@@ -198,9 +201,14 @@ export default {
{ label: 'Seedance 2.0', value: 'ep-20260326165811-dlkth' },
{ label: 'Seedance 2.0 Fast', value: 'ep-20260326170056-dkj9m' }
],
- selectedModel: 'ep-20260326165811-dlkth'
+ selectedModel: 'ep-20260326165811-dlkth',
+ // 已上传的图片列表(用于@功能)
+ uploadedImages: []
}
},
+ components: {
+ RichTextEditor
+ },
computed: {
...mapGetters(['lang']),
},
@@ -352,6 +360,21 @@ export default {
this.templateDialogVisible = false
// 不重置selectedTemplate,保持用户的选择状态,方便二次选择
},
+ // 处理富文本内容变化
+ handleTextChange(content) {
+ this.editorContent = content
+ // 同步到旧的 text 字段以保持兼容性
+ this.text = content
+ },
+ // 处理上传的图片(用于@功能)
+ handleImageUpload(imageInfo) {
+ if (imageInfo && imageInfo.url) {
+ this.uploadedImages.push({
+ url: imageInfo.url,
+ name: imageInfo.name || 'image'
+ })
+ }
+ },
close() {
this.showResult = false
},
@@ -415,7 +438,7 @@ export default {
url: 'api/ai/imgToImg',
method: 'POST',
data: {
- text: this.text,
+ text: this.editorContent || this.text,
firstUrl: this.firstUrl.url,
functionType: this.current == 1 ? '11' : '12',
tags: tags.join(','),
@@ -531,6 +554,59 @@ export default {
border-color: rgba(255,255,255,0.1);
}
}
+
+ /* 富文本编辑器样式 */
+ .rich-editor-root {
+ margin-bottom: 20px;
+
+ .toolbar {
+ display: flex;
+ gap: 8px;
+ margin-bottom: 12px;
+ padding: 8px;
+ background-color: #1a1b20;
+ border-radius: 6px;
+ border: 1px solid rgba(255,255,255,0.1);
+
+ .tool-btn {
+ padding: 6px 12px;
+ background-color: rgba(255,255,255,0.05);
+ border: 1px solid rgba(255,255,255,0.1);
+ color: #fff;
+ border-radius: 4px;
+ cursor: pointer;
+ font-size: 13px;
+
+ &:hover {
+ background-color: rgba(255,255,255,0.1);
+ border-color: rgba(255,255,255,0.2);
+ }
+ }
+ }
+
+ .rich-editor {
+ min-height: 160px;
+ padding: 16px;
+ background-color: #1a1b20;
+ border: 1px solid rgba(255,255,255,0.1);
+ border-radius: 6px;
+ color: #fff;
+ font-size: 14px;
+ line-height: 1.6;
+ outline: none;
+ resize: none;
+
+ &:focus {
+ border-color: rgb(var(--primary-6));
+ }
+
+ &[data-placeholder]:empty::before {
+ content: attr(data-placeholder);
+ color: #5c5d68;
+ pointer-events: none;
+ }
+ }
+ }
&-title {
display: flex;
align-items: center;