Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
lib
react-ag-qeditor
Commits
408df449
Commit
408df449
authored
Aug 29, 2026
by
Яков
Browse files
update
parent
3e9b122e
Changes
3
Hide whitespace changes
Inline
Side-by-side
package.json
View file @
408df449
{
{
"name"
:
"react-ag-qeditor"
,
"name"
:
"react-ag-qeditor"
,
"version"
:
"1.1.8
0
"
,
"version"
:
"1.1.8
1
"
,
"description"
:
"WYSIWYG html editor"
,
"description"
:
"WYSIWYG html editor"
,
"author"
:
"atma"
,
"author"
:
"atma"
,
"license"
:
"
MIT
"
,
"license"
:
"
MIT
"
,
...
...
src/components/ToolBar.js
View file @
408df449
...
@@ -37,17 +37,41 @@ const TABLE_GROUP = {
...
@@ -37,17 +37,41 @@ const TABLE_GROUP = {
}
}
/**
/**
*
Урок
: полный набор.
*
Модуль
: полный набор.
*
*
* ──
Почему групп мало ───────────────────────────
─────────────────────────────
* ──
Бюджет ширины: 1080 px, и это не «хорошо бы»
─────────────────────────────
*
*
* Каждая граница групп стоит 17 px (разделитель 1 + поля по 8). Раньше почти
* 1080 — не случайное число и не ширина моего окна. Это МИНИМАЛЬНАЯ ширина
* каждая кнопка была своей группой — двадцать две границы, 289 px только
* поля редактора на старых экранах, под которые платформа обязана работать.
* на волосяные линии, и панель не укладывалась в один ряд. Заодно двадцать две
* Значит набор верстается под неё, а не «поместится на большом мониторе».
* линии не показывают структуру, а превращаются в частокол.
*
*
* Теперь границ шесть, по смыслу: правка · структура · оформление блока ·
* Замер живой панели (`/tmp/measure-bar.js`, ширина поля 1078, поля 6+6):
* вставка · оживить урок · документы и ссылки.
* доступно 1066
* первый ряд занимал 1057
* кнопка «ⓘ» с зазором 28
* ────────────────────────────────
* не влезало на 19 → «ⓘ» уезжала во второй ряд,
* панель становилась 70 px вместо 46
* подпись «Оживить модуль» 125 → её пришлось спрятать @container'ом
*
* То есть ряд не сходился ещё ДО подписи, а подпись была отключена
* до ширины 1200 — то есть на целевом экране её не видел никто. Это было
* не решение, а способ не признать, что набор шире бюджета.
*
* ── Как ряд уложен в бюджет ──────────────────────────────────────────────────
*
* объединены «встроить» и «записи» в один список −48
* «файл» уехал к документам (он и есть документ) −34
* «встроить по коду» уехал к встраиванию −34
* убраны два разделителя вокруг обведённой группы −30
* ────────────────────────────────────────────────────────
* −146
*
* Разделители у обведённой группы убраны не ради пикселей: у неё СВОЯ рамка,
* и линия вплотную к рамке — это две границы подряд на 4 px друг от друга.
*
* Границ теперь четыре, по смыслу: правка · структура · вставка ·
* документы и ссылки; плюс обведённая группа «Оживить модуль».
*/
*/
const
LESSON
=
[
const
LESSON
=
[
{
type
:
'
g
'
,
items
:
[
'
undo
'
,
'
redo
'
,
'
clearMarks
'
]
},
{
type
:
'
g
'
,
items
:
[
'
undo
'
,
'
redo
'
,
'
clearMarks
'
]
},
...
@@ -59,9 +83,7 @@ const LESSON = [
...
@@ -59,9 +83,7 @@ const LESSON = [
{
type
:
'
g
'
,
items
:
[
'
bulletList
'
,
'
orderedList
'
]
},
{
type
:
'
g
'
,
items
:
[
'
bulletList
'
,
'
orderedList
'
]
},
{
type
:
'
s
'
,
toggle
:
true
,
items
:
[
'
alignLeft
'
,
'
alignCenter
'
,
'
alignRight
'
]
},
{
type
:
'
s
'
,
toggle
:
true
,
items
:
[
'
alignLeft
'
,
'
alignCenter
'
,
'
alignRight
'
]
},
// Особые блоки одним списком: у всех пяти общая роль — выделить кусок
// Особые блоки одним списком: у всех пяти общая роль — выделить кусок
// материала из общего потока. Врезка и скрытый разбор попали сюда, а не
// материала из общего потока.
// в «Оживить модуль», по замеру ширины: в один ряд панель укладывается
// до 1080 px, и две лишние видимые кнопки её ломали.
{
type
:
'
s
'
,
toggle
:
false
,
items
:
[
'
blockquote
'
,
'
callout
'
,
'
showAnswer
'
,
'
hr
'
,
'
codeBlock
'
]
},
{
type
:
'
s
'
,
toggle
:
false
,
items
:
[
'
blockquote
'
,
'
callout
'
,
'
showAnswer
'
,
'
hr
'
,
'
codeBlock
'
]
},
TABLE_GROUP
,
TABLE_GROUP
,
{
type
:
'
g
'
,
items
:
[
'
emoji
'
]
},
{
type
:
'
g
'
,
items
:
[
'
emoji
'
]
},
...
@@ -70,35 +92,38 @@ const LESSON = [
...
@@ -70,35 +92,38 @@ const LESSON = [
{
type
:
'
g
'
,
items
:
[
'
activityRef
'
]
},
{
type
:
'
g
'
,
items
:
[
'
activityRef
'
]
},
{
type
:
'
g
'
,
items
:
[
'
image
'
]
},
{
type
:
'
g
'
,
items
:
[
'
image
'
]
},
{
type
:
'
s
'
,
toggle
:
false
,
items
:
[
'
video
'
,
'
iframe
'
]
},
// Три записи — голос, камера, экран — под одной кнопкой. Иконки у них
// близкие, в ряд они читались как одно и то же; в списке у каждой подпись
// словами, и различить их можно с первого взгляда.
{
type
:
'
s
'
,
toggle
:
false
,
items
:
[
'
voicemessage
'
,
'
webcamera
'
,
'
screencust
'
]
},
{
type
:
'
g
'
,
items
:
[
'
|
'
]
},
// ── Видео, встраивание и записи — один список ────────────────────────────
//
// Раньше это были два списка рядом: «встроить» (файл, ссылка) и «записи»
// (голос, камера, экран). Делить их незачем — у всех шести один вопрос
// автора: «как положить сюда видео или вставку». Зато два списка стоили
// 48 px, которых не хватало ряду.
//
// Иконки у записей близкие и в ряд читались как одно и то же; в списке
// у каждой подпись словами, и различить их можно с первого взгляда.
{
type
:
'
s
'
,
toggle
:
false
,
title
:
'
video
'
,
items
:
[
'
video
'
,
'
iframe
'
,
'
iframe_custom
'
,
'
voicemessage
'
,
'
webcamera
'
,
'
screencust
'
]
},
// ── «Оживить
урок» ──
─────────────────────────────────────────────────────
// ── «Оживить
модуль»
─────────────────────────────────────────────────────
//
//
//
Четыре
кнопк
и
: аудио, картинка с подсказками, скрытый блок,
//
Пять
кноп
о
к: аудио, картинка с подсказками,
самопроверка,
скрытый блок,
// кнопка-ссылка. На боевой базе клиента (601
урок
) каждая использована
// кнопка-ссылка. На боевой базе клиента (601
модуль
) каждая использована
// НОЛЬ раз, хотя все работают.
// НОЛЬ раз, хотя все работают.
//
//
// Иконки и подсказки они уже получили — этого мало: растворённые между
// Иконки и подсказки они уже получили — этого мало: растворённые между
// «изображением» и «ссылкой», они не читаются как отдельная возможность.
// «изображением» и «ссылкой», они не читаются как отдельная возможность.
// Поэтому у них своя обведённая группа с подписью. Мера бесплатная
// Поэтому у них своя обведённая группа С ПОДПИСЬЮ — и подпись обязана быть
// и делает необязательными дорогие — разовую подсветку новинки
// видна на 1080, иначе от неё нет никакого толка.
// и карточки-примеры в пустом уроке.
{
type
:
'
g
'
,
label
:
'
Оживить модуль
'
,
{
type
:
'
g
'
,
label
:
'
Оживить модуль
'
,
items
:
[
'
audio
'
,
'
interactiveImage
'
,
'
selfCheck
'
,
'
insertToggleBlock
'
,
'
buttonLink
'
]
},
items
:
[
'
audio
'
,
'
interactiveImage
'
,
'
selfCheck
'
,
'
insertToggleBlock
'
,
'
buttonLink
'
]
},
{
type
:
'
g
'
,
items
:
[
'
|
'
]
},
// Документы одним списком — это и была главная путаница старой панели:
// четыре разные вещи со словом «pdf» в подписи. Рядом, с человеческими
// Все четыре «пдф-кнопки» в одном списке — это и была главная путаница
// названиями, они наконец различимы. «Файл на скачивание» сюда же:
// старой панели: четыре разные вещи со словом «pdf» в подписи. Рядом,
// вложение — такой же документ, а не сосед ссылки.
// с человеческими названиями, они наконец различимы.
{
type
:
'
s
'
,
toggle
:
false
,
items
:
[
'
iframe_pptx
'
,
'
iframe_pdf
'
,
'
pdf
'
,
'
export_pdf
'
,
'
file
'
]
},
{
type
:
'
s
'
,
toggle
:
false
,
items
:
[
'
iframe_pptx
'
,
'
iframe_pdf
'
,
'
pdf
'
,
'
export_pdf
'
]
},
{
type
:
'
g
'
,
items
:
[
'
link
'
]
},
{
type
:
'
g
'
,
items
:
[
'
link
'
,
'
file
'
,
'
iframe_custom
'
]
},
]
]
/**
/**
...
...
src/index.scss
View file @
408df449
...
@@ -301,23 +301,23 @@ body{
...
@@ -301,23 +301,23 @@ body{
margin: 0 4px;
margin: 0 4px;
}
}
// Подпись видна ВСЕГДА, в том числе на 1080 — целевой ширине поля
// редактора на старых экранах.
//
// Здесь стояло `display: none` с показом от @container 1200px.
// Это значило, что на экране, под который панель и делается,
// подписи не видел никто, а вся затея с обведённой группой
// теряла смысл. Место под подпись найдено в самом наборе кнопок
// (см. LESSON в ToolBar.js), а не отложено до большого монитора.
&-label{
&-label{
display:
no
ne;
display:
inli
ne;
font-size: 10px;
font-size: 10px;
font-weight: 600;
font-weight: 600;
letter-spacing: 0.06em;
letter-spacing: 0.06em;
text-transform: uppercase;
text-transform: uppercase;
color: #6B7280;
color: #6B7280;
white-space: nowrap;
white-space: nowrap;
padding: 0 8px 0 6px;
padding: 0 6px 0 4px;
// Подпись занимает 96 px и появляется только там, где панель
// и без неё укладывается в один ряд. Браузер без поддержки
// @container подпись просто не покажет — деградация мягкая,
// группу всё равно видно по рамке.
@container (min-width: 1200px){
display: inline;
}
}
}
.qseparator{
.qseparator{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment