remove-unused-styles
All checks were successful
deploy / testbuild (push) Successful in 2m13s
deploy / Update templates on Mailgun (push) Has been skipped

This commit is contained in:
Untone 2024-10-11 16:36:19 +03:00
parent a1ca2251a5
commit 0857ca8775
7 changed files with 33 additions and 203 deletions

View File

@ -1,6 +1,6 @@
import { HocuspocusProvider } from '@hocuspocus/provider' import { HocuspocusProvider } from '@hocuspocus/provider'
import { UploadFile } from '@solid-primitives/upload' import { UploadFile } from '@solid-primitives/upload'
import { Editor, EditorOptions, isTextSelection } from '@tiptap/core' import { Editor, EditorOptions } from '@tiptap/core'
import { BubbleMenu } from '@tiptap/extension-bubble-menu' import { BubbleMenu } from '@tiptap/extension-bubble-menu'
import { CharacterCount } from '@tiptap/extension-character-count' import { CharacterCount } from '@tiptap/extension-character-count'
import { Collaboration } from '@tiptap/extension-collaboration' import { Collaboration } from '@tiptap/extension-collaboration'
@ -42,18 +42,18 @@ export const EditorComponent = (props: EditorComponentProps) => {
const { session, requireAuthentication } = useSession() const { session, requireAuthentication } = useSession()
const author = createMemo<Author>(() => session()?.user?.app_data?.profile as Author) const author = createMemo<Author>(() => session()?.user?.app_data?.profile as Author)
const [isCommonMarkup, setIsCommonMarkup] = createSignal(false) const [isCommonMarkup, setIsCommonMarkup] = createSignal(false)
const [shouldShowTextBubbleMenu, setShouldShowTextBubbleMenu] = createSignal(false)
const { showSnackbar } = useSnackbar() const { showSnackbar } = useSnackbar()
const { countWords, setEditing, isCollabMode } = useEditorContext() const { countWords, setEditing, isCollabMode } = useEditorContext()
const [editorOptions, setEditorOptions] = createSignal<Partial<EditorOptions>>({}) const [editorOptions, setEditorOptions] = createSignal<Partial<EditorOptions>>({})
const [editorElRef, setEditorElRef] = createSignal<HTMLElement | undefined>() const [editorElRef, setEditorElRef] = createSignal<HTMLElement | undefined>()
const [textBubbleMenuRef, setTextBubbleMenuRef] = createSignal<HTMLDivElement | undefined>()
const [incutBubbleMenuRef, setIncutBubbleMenuRef] = createSignal<HTMLDivElement | undefined>() const [incutBubbleMenuRef, setIncutBubbleMenuRef] = createSignal<HTMLDivElement | undefined>()
const [figureBubbleMenuRef, setFigureBubbleMenuRef] = createSignal<HTMLDivElement | undefined>() const [figureBubbleMenuRef, setFigureBubbleMenuRef] = createSignal<HTMLDivElement | undefined>()
const [blockquoteBubbleMenuRef, setBlockquoteBubbleMenuRef] = createSignal<HTMLDivElement | undefined>() const [blockquoteBubbleMenuRef, setBlockquoteBubbleMenuRef] = createSignal<HTMLDivElement | undefined>()
const [floatingMenuRef, setFloatingMenuRef] = createSignal<HTMLDivElement | undefined>() const [floatingMenuRef, setFloatingMenuRef] = createSignal<HTMLDivElement | undefined>()
const [fullBubbleMenuRef, setFullBubbleMenuRef] = createSignal<HTMLDivElement | undefined>()
const [editor, setEditor] = createSignal<Editor | null>(null) const [editor, setEditor] = createSignal<Editor | null>(null)
const [menusInitialized, setMenusInitialized] = createSignal(false) const [menusInitialized, setMenusInitialized] = createSignal(false)
const [shouldShowFullBubbleMenu, setShouldShowFullBubbleMenu] = createSignal(false)
// store tiptap editor in context provider's signal to use it in Panel // store tiptap editor in context provider's signal to use it in Panel
createEffect(() => setEditing(editor() || undefined)) createEffect(() => setEditing(editor() || undefined))
@ -173,35 +173,29 @@ export const EditorComponent = (props: EditorComponentProps) => {
const initializeMenus = () => { const initializeMenus = () => {
if (menusInitialized() || !editor()) return if (menusInitialized() || !editor()) return
if (blockquoteBubbleMenuRef() && figureBubbleMenuRef() && incutBubbleMenuRef() && floatingMenuRef()) { if (
blockquoteBubbleMenuRef() &&
figureBubbleMenuRef() &&
incutBubbleMenuRef() &&
floatingMenuRef() &&
fullBubbleMenuRef()
) {
console.log('stage 3: initialize menus when editor instance is ready') console.log('stage 3: initialize menus when editor instance is ready')
const menus = [ const menus = [
BubbleMenu.configure({ BubbleMenu.configure({
pluginKey: 'textBubbleMenu', element: fullBubbleMenuRef()!,
element: textBubbleMenuRef()!, pluginKey: 'fullBubbleMenu',
shouldShow: ({ editor: e, state: { doc, selection }, from, to }) => { shouldShow: ({ editor: e, state: { selection } }) => {
const isEmptyTextBlock = doc.textBetween(from, to).length === 0 && isTextSelection(selection) const { empty, from, to } = selection
if (isEmptyTextBlock) { const hasSelection = !empty && from !== to
e?.chain().focus().removeTextWrap({ class: 'highlight-fake-selection' }).run() const shouldShow =
return false e.view.hasFocus() && hasSelection && !e.isActive('image') && !e.isActive('figure')
} setShouldShowFullBubbleMenu(shouldShow)
const hasSelection = !selection.empty && from !== to return shouldShow
const isFootnoteOrFigcaption =
e.isActive('footnote') || (e.isActive('figcaption') && hasSelection)
const result =
e.view.hasFocus() &&
hasSelection &&
!e.isActive('image') &&
!e.isActive('figure') &&
(isFootnoteOrFigcaption || !e.isActive('figcaption'))
setShouldShowTextBubbleMenu(result)
return result
}, },
tippyOptions: { tippyOptions: {
sticky: true duration: 200,
// onHide: () => { editor()?.commands.focus() } placement: 'top'
} }
}), }),
BubbleMenu.configure({ BubbleMenu.configure({
@ -351,10 +345,10 @@ export const EditorComponent = (props: EditorComponentProps) => {
</div> </div>
<FullBubbleMenu <FullBubbleMenu
shouldShow={shouldShowTextBubbleMenu}
isCommonMarkup={isCommonMarkup()}
editor={editor as Accessor<Editor | undefined>} editor={editor as Accessor<Editor | undefined>}
ref={setTextBubbleMenuRef} ref={setFullBubbleMenuRef}
shouldShow={shouldShowFullBubbleMenu}
isCommonMarkup={isCommonMarkup()}
/> />
<BlockquoteBubbleMenu editor={editor() as Editor} ref={setBlockquoteBubbleMenuRef} /> <BlockquoteBubbleMenu editor={editor() as Editor} ref={setBlockquoteBubbleMenuRef} />
<FigureBubbleMenu editor={editor() as Editor} ref={setFigureBubbleMenuRef} /> <FigureBubbleMenu editor={editor() as Editor} ref={setFigureBubbleMenuRef} />

View File

@ -35,8 +35,4 @@
} }
} }
}
:global(.tippy-box) {
line-height: 1.3;
} }

View File

@ -9,7 +9,7 @@
.chatTitleInput { .chatTitleInput {
width: 100%; width: 100%;
padding: 0.5rem 1rem; padding: 0.5rem 1rem;
font-size: 1.25rem; // Эквивалент fs-3 font-size: 1.25rem;
line-height: 1.5; line-height: 1.5;
border: 1px solid #ced4da; border: 1px solid #ced4da;
border-radius: 0.3rem; border-radius: 0.3rem;

View File

@ -77,8 +77,6 @@ const CreateModalContent = (props: Props) => {
type="text" type="text"
required={true} required={true}
class={styles.chatTitleInput} class={styles.chatTitleInput}
// TODO: Удалите эти классы, если они не нужны
// class="form-control form-control-lg fs-3"
placeholder={t('Chat Title')} placeholder={t('Chat Title')}
/> />
)} )}

View File

@ -198,143 +198,6 @@ button {
} }
} }
.button--subscribe {
background: var(--background-color);
color: var(--default-color);
border: 2px solid var(--black-100);
font-size: 1.5rem;
justify-content: center;
padding: 0.6rem 1.2rem;
transition: background-color 0.2s;
img {
height: auto;
transition: filter 0.2s;
}
&:hover {
background: var(--background-color-invert);
color: var(--default-color-invert);
img {
filter: invert(1);
}
}
}
.button--light {
font-size:1.5rem;
background-color: var(--black-100);
border-radius: 0.8rem;
color: var(--default-color);
font-weight: 500;
height: auto;
padding: 0.6rem 1.2rem 0.6rem 1rem;
&:hover {
background: var(--black-300);
}
}
.button--subscribe-topic {
background: var(--background-color);
color: var(--default-color);
border: 2px solid var(--default-color);
border-radius: 0.8rem;
font-size: 1.4rem;
line-height: 2.8rem;
height: 3.2rem;
padding: 0 1rem;
&:hover {
background: var(--background-color-invert);
color: var(--default-color-invert);
opacity: 1;
.icon {
filter: invert(1);
}
}
&[disabled]:hover {
background: var(--background-color);
color: var(--default-color);
}
.icon {
display: inline-block;
margin-right: 0.3em;
vertical-align: text-bottom;
width: 1.4em;
}
}
.button--content-index {
@include media-breakpoint-up(md) {
margin-top: -0.5rem;
position: sticky;
top: 135px;
}
@include media-breakpoint-up(sm) {
right: $container-padding-x;
}
background: none;
border: 2px solid var(--white-500);
height: 3.2rem;
float: right;
padding: 0;
position: absolute;
right: $container-padding-x * 0.5;
top: -0.5rem;
width: 3.2rem;
z-index: 1;
.icon {
background: #fff;
transition: filter 0.3s;
}
.icon,
img {
height: 100%;
vertical-align: middle;
width: auto;
}
&:hover {
.icon {
filter: invert(1);
}
}
.expanded {
border-radius: 100%;
overflow: hidden;
img {
height: auto;
margin-top: 0.8rem;
}
}
}
.button--submit,
.button--outline {
font-size:2rem;
padding: 1.6rem 2rem;
}
.button--outline {
background: none;
box-shadow: inset 0 0 0 2px #000;
color: #000;
&:hover {
box-shadow: inset 0 0 0 2px var(--black-300);
}
}
form { form {
input[type='text'], input[type='text'],
@ -955,4 +818,12 @@ iframe {
svg { svg {
filter: invert(1); filter: invert(1);
} }
}
.fixed {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1030;
} }

View File

@ -29,20 +29,6 @@
} }
} }
.loadMoreContainer {
margin-top: 48px;
text-align: center;
.loadMoreButton {
@include media-breakpoint-up(sm) {
width: auto;
}
padding: 0.6em 3em;
width: 100%;
}
}
.alphabet { .alphabet {
font-size:1.5rem; font-size:1.5rem;
color: rgba(0 0 0 / 20%); color: rgba(0 0 0 / 20%);

View File

@ -29,21 +29,6 @@
} }
} }
.loadMoreContainer {
margin-top: 48px;
text-align: center;
.loadMoreButton {
@include media-breakpoint-up(sm) {
width: auto;
}
padding: 0.6em 3em;
width: 100%;
}
}
.alphabet { .alphabet {
font-size:1.5rem; font-size:1.5rem;
color: rgba(0 0 0 / 20%); color: rgba(0 0 0 / 20%);