ddeck-remote 0.0.0-stage → 0.9.7-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +40 -0
- package/README.md +96 -2
- package/THIRD-PARTY-LICENSES.md +69 -0
- package/cordis.patch.yml +22 -0
- package/icon.svg +6 -0
- package/install.cmd +4 -0
- package/install.ps1 +119 -0
- package/install.sh +95 -0
- package/lib/admin-trust.js +64 -0
- package/lib/client.js +751 -0
- package/lib/constants.js +11 -0
- package/lib/gateway-bundle.js +7063 -0
- package/lib/gateway.js +275 -0
- package/lib/index.js +1088 -0
- package/lib/mobile/index.js +82 -0
- package/lib/mobile/skin.css +1904 -0
- package/lib/mobile/skin.js +3614 -0
- package/lib/node-forge-bundle.js +17841 -0
- package/lib/qr-bundle.js +1990 -0
- package/lib/tls.js +173 -0
- package/locale/en.json +4 -0
- package/locale/ru.json +4 -0
- package/package.json +63 -4
- package/uninstall.ps1 +60 -0
- package/uninstall.sh +31 -0
|
@@ -0,0 +1,1904 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* DDeck — мобильный слой (оформление страницы клиента).
|
|
3
|
+
*
|
|
4
|
+
* Документ — клиент DeepSeek Harness: переписка, инструменты и стриминг живут в его
|
|
5
|
+
* бандле, и переписывать их значило бы заново реализовать продукт. Здесь только то, что
|
|
6
|
+
* на телефоне сделано для мыши: сетка из трёх колонок, постоянная рейка, панель,
|
|
7
|
+
* которая отнимает ширину вместо того, чтобы накрывать, и мелкие цели, в которые
|
|
8
|
+
* палец не попадает.
|
|
9
|
+
*
|
|
10
|
+
* Классы клиента хешированные (`pI_x6G_header`), поэтому правила адресуются по
|
|
11
|
+
* окончанию имени (`:is([class$="_header"], [class*="_header "])`) или по публичным data-атрибутам клиента;
|
|
12
|
+
* собственные классы и атрибуты слоя начинаются с `dshm-`. Каждое правило ниже —
|
|
13
|
+
* результат замера на живом телефоне (360 × 800, плотность 3): в комментариях указано,
|
|
14
|
+
* что именно было измерено и почему правило выглядит так.
|
|
15
|
+
*
|
|
16
|
+
* ОГЛАВЛЕНИЕ
|
|
17
|
+
* 1. Основа: тема и системные цвета
|
|
18
|
+
* 2. Каркас и боковая панель (выдвижной ящик)
|
|
19
|
+
* 3. Чат: шапка и лента сообщений
|
|
20
|
+
* 4. Композер и очередь сообщений
|
|
21
|
+
* 5. Карточка вопроса агента и plan review
|
|
22
|
+
* 6. Плагины и автозадачи: заголовки, детали, мелкие цели
|
|
23
|
+
* 7. Настройки, меню и диалоги
|
|
24
|
+
* 8. Правая панель: файлы, терминал, браузер, журнал
|
|
25
|
+
* 9. Панель Remote и служебные строки
|
|
26
|
+
* 10. Переопределения: ландшафт с открытой клавиатурой
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
/* ── 1. ОСНОВА: ТЕМА И СИСТЕМНЫЕ ЦВЕТА ───────────────────────────────────────────
|
|
30
|
+
* Переменных вида --dsw-alias-* в клиенте нет (проверено), а системный Canvas не
|
|
31
|
+
* переключается на лету: в «светлой» пробе текст становился чёрным, а фон оставался
|
|
32
|
+
* тёмным — нечитаемо. Поэтому тему читает слой и выставляет свои переменные явно.
|
|
33
|
+
* Тема приходит из color-scheme клиента (см. applyTheme в skin.js).
|
|
34
|
+
*/
|
|
35
|
+
|
|
36
|
+
html[data-dshm-theme="dark"]{--dshm-surface:#1b1b1c;--dshm-raised:color-mix(in srgb, var(--dshm-surface,#1b1b1c) 92%, var(--dshm-ink,#ffffff));--dshm-ink:#ffffff;--dshm-line:rgba(255,255,255,.14);--dshm-scrim:rgba(0,0,0,.45)}
|
|
37
|
+
|
|
38
|
+
html[data-dshm-theme="light"]{--dshm-surface:#ffffff;--dshm-raised:color-mix(in srgb, var(--dshm-surface,#ffffff) 94%, var(--dshm-ink,#111114));--dshm-ink:#111114;--dshm-line:rgba(0,0,0,.14);--dshm-scrim:rgba(0,0,0,.28)}
|
|
39
|
+
|
|
40
|
+
/* ── 2. КАРКАС И БОКОВАЯ ПАНЕЛЬ (ВЫДВИЖНОЙ ЯЩИК) ─────────────────────────────────
|
|
41
|
+
* Сетка кадра, рейка, панель, затенение, кнопка меню и всё, что живёт внутри
|
|
42
|
+
* боковой панели: поиск, строки сессий и рабочих областей, действия выбранной
|
|
43
|
+
* строки, подвал панели. Исходно `display: grid` с колонками `56px 304px 0px`;
|
|
44
|
+
* в открытой панели `280px 80px 0px` — из 360 px ширины содержимому остаётся 80,
|
|
45
|
+
* то есть телефон становится непригодным. На телефоне колонка одна, а панель
|
|
46
|
+
* приходит поверх — как в любом мобильном приложении. Все замеры — 360 × 800,
|
|
47
|
+
* плотность 3.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
/* Только каркас приложения: `_frame` есть ещё у десятка сеток (например, плитки
|
|
51
|
+
* вложений), и глобальное правило рвало их раскладку. */
|
|
52
|
+
:is([class$="_frame"], [class*="_frame "]):has(> :is([class$="_centerCol"], [class*="_centerCol "])){grid-template-columns:1fr!important}
|
|
53
|
+
|
|
54
|
+
:is([class$="_centerCol"], [class*="_centerCol "]){grid-column:1!important;grid-row:1!important;min-width:0!important}
|
|
55
|
+
|
|
56
|
+
:is([class$="_rightbarCol"], [class*="_rightbarCol "]){grid-column:1!important;grid-row:1!important;min-width:0!important}
|
|
57
|
+
|
|
58
|
+
/* Правая колонка стоит в той же ячейке сетки, что и содержимое, и, будучи нулевой
|
|
59
|
+
* ширины, всё равно перехватывала касания: аудит насчитал 12 элементов, которые
|
|
60
|
+
* «накрыты pI_x6G_rightbarCol» — заголовок, кнопки копирования, реакции. Нажатия
|
|
61
|
+
* проходят только у её собственного содержимого.
|
|
62
|
+
*/
|
|
63
|
+
:is([class$="_rightbarCol"], [class*="_rightbarCol "]){pointer-events:none!important}
|
|
64
|
+
|
|
65
|
+
:is([class$="_rightbarCol"], [class*="_rightbarCol "]) > *{pointer-events:auto}
|
|
66
|
+
|
|
67
|
+
/* Один слой вместо двух: у клиента внутренний root ящика имел свой фон и ширину
|
|
68
|
+
* меньше колонки, из-за чего меню выглядело как панель на панели. Фон внутреннего
|
|
69
|
+
* root прозрачный, ширина — на всю колонку; остаётся один край и одна поверхность. */
|
|
70
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]) > div > [class*="_root"]{
|
|
71
|
+
background:transparent!important;
|
|
72
|
+
width:100%!important;
|
|
73
|
+
border-radius:0!important;
|
|
74
|
+
box-shadow:none!important;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]){position:fixed!important;top:0;bottom:0;left:0;width:min(19rem,84vw)!important;z-index:60;transform:translate3d(-102%,0,0);will-change:transform;backface-visibility:hidden;transition:transform .22s cubic-bezier(.2,.7,.3,1);background:var(--dshm-surface,#1b1b1c)!important;color:var(--dshm-ink,#ffffff)!important;border-right:1px solid var(--dshm-line,rgba(255,255,255,.14))!important;box-shadow:.75rem 0 2rem rgba(0,0,0,.45)!important;padding-top:env(safe-area-inset-top);padding-bottom:env(safe-area-inset-bottom);overflow:hidden!important;overscroll-behavior:contain}
|
|
78
|
+
|
|
79
|
+
/* Панель живёт в собственном слое композитора.
|
|
80
|
+
*
|
|
81
|
+
* Замеры: без слоя открытие стоило 167–267 мс и до шести длинных задач — браузер
|
|
82
|
+
* каждый раз перерисовывал всю колонку. С `will-change: transform` и сдвигом через
|
|
83
|
+
* translate3d открытие и закрытие укладываются в 8–9 мс без длинных задач.
|
|
84
|
+
*/
|
|
85
|
+
/* !important обязателен: наш <style> вставлен в <head> раньше стилей клиента, и при
|
|
86
|
+
* равной специфичности панель оставалась тёмной в светлой теме.
|
|
87
|
+
*/
|
|
88
|
+
/* Прокрутка, а не обрезка: рабочих областей и сессий может быть много, и
|
|
89
|
+
* `overflow: hidden` просто съедал бы нижние строки.
|
|
90
|
+
*/
|
|
91
|
+
html[data-dshm-drawer] :is([class$="_sidebarCol"], [class*="_sidebarCol "]){transform:translate3d(0,0,0)}
|
|
92
|
+
|
|
93
|
+
/* Затемнение под панелью: нажатие снаружи закрывает её — привычный жест. */
|
|
94
|
+
.dshm-scrim{position:fixed;inset:0;z-index:55;background:var(--dshm-scrim,rgba(0,0,0,.72));opacity:0;pointer-events:none;transition:opacity .22s ease;border:0;padding:0;cursor:pointer}
|
|
95
|
+
|
|
96
|
+
html[data-dshm-drawer] .dshm-scrim{opacity:1;pointer-events:auto}
|
|
97
|
+
|
|
98
|
+
.dshm-menu{position:fixed;z-index:50;left:max(.5rem,env(safe-area-inset-left));top:calc(env(safe-area-inset-top) + .5rem);width:2.75rem;height:2.75rem;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--dshm-line,rgba(255,255,255,.14));border-radius:.75rem;background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#ffffff);cursor:pointer;-webkit-tap-highlight-color:transparent}
|
|
99
|
+
|
|
100
|
+
.dshm-menu svg{width:1.25rem;height:1.25rem}
|
|
101
|
+
|
|
102
|
+
html[data-dshm-drawer] .dshm-menu{opacity:0;pointer-events:none}
|
|
103
|
+
|
|
104
|
+
/* Кнопки «Отключить» и подобные — замер: 36 px (min-height 2.25rem). */
|
|
105
|
+
/* Панель — родная колонка клиента: свои иконки, свои строки, свои группы. Свою копию
|
|
106
|
+
* интерфейса не рисуем: она теряла иконки и выглядела чужой.
|
|
107
|
+
*/
|
|
108
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]){visibility:visible!important}
|
|
109
|
+
|
|
110
|
+
/* Перехватчик изменения размера окна — настольная деталь.
|
|
111
|
+
*
|
|
112
|
+
* Аудит: он перекрывал кнопку «1 напоминание» в шапке чата, и та не нажималась вовсе.
|
|
113
|
+
*/
|
|
114
|
+
:is([class$="_frame"], [class*="_frame "]) :is([class$="_handle"], [class*="_handle "]){display:none!important}
|
|
115
|
+
|
|
116
|
+
/* Подвал боковой панели.
|
|
117
|
+
*
|
|
118
|
+
* Замер: строке 256 px, в ней две кнопки плагинов по ~128 px — впритык, без зазора, и
|
|
119
|
+
* длинная подпись штатного плагина обрезается («Mobile acce…»). На телефоне список
|
|
120
|
+
* кнопок лучше ставить в столбик: подписи читаются целиком, а палец не попадает между
|
|
121
|
+
* двумя соседними целями.
|
|
122
|
+
*/
|
|
123
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]) :is([class$="_footerActions"], [class*="_footerActions "]){display:flex!important;flex-wrap:wrap!important;gap:.25rem!important;padding:.25rem 0!important}
|
|
124
|
+
|
|
125
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]) :is([class$="_footerActions"], [class*="_footerActions "]) > *{flex:1 1 100%!important;min-width:0!important}
|
|
126
|
+
|
|
127
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]) :is([class$="_footerActions"], [class*="_footerActions "]) button{width:100%!important;min-width:0!important;height:2.75rem!important;justify-content:flex-start!important}
|
|
128
|
+
|
|
129
|
+
/* Поиск по сессиям в боковой панели.
|
|
130
|
+
*
|
|
131
|
+
* Замер: поле 197 × 20 px, шрифт 13 px — палец по нему промахивается, а мелкий
|
|
132
|
+
* шрифт заставляет приближать. Поднимаем до 36 px и 16 px шрифта; строка поиска
|
|
133
|
+
* растёт вместе с полем.
|
|
134
|
+
*/
|
|
135
|
+
:is([class$="_searchInput"], [class*="_searchInput "]){height:2.75rem!important;font-size:1rem!important;padding:0 .5rem!important}
|
|
136
|
+
|
|
137
|
+
/* Строки боковой панели.
|
|
138
|
+
*
|
|
139
|
+
* Замер: «Плагины» и «Автоматические задачи» 252x36, рабочая область 256x34, «Новая
|
|
140
|
+
* сессия» 252x38 — всё ниже 44, которые палец находит без прицеливания. Поднимаем до
|
|
141
|
+
* 44 и добавляем вертикальный воздух между смысловыми блоками.
|
|
142
|
+
*/
|
|
143
|
+
:is([class$="_panelRow"], [class*="_panelRow "]), :is([class$="_projectRow"], [class*="_projectRow "]), :is([class$="_newSession"], [class*="_newSession "]){min-height:2.75rem!important;align-items:center!important}
|
|
144
|
+
|
|
145
|
+
:is([class$="_panelList"], [class*="_panelList "]){gap:.125rem!important}
|
|
146
|
+
|
|
147
|
+
:is([class$="_groupSection"], [class*="_groupSection "]){margin-bottom:.25rem!important}
|
|
148
|
+
|
|
149
|
+
/* Действия строки сессии — по первому касанию.
|
|
150
|
+
*
|
|
151
|
+
* На настольном клиенте закрепить/архивировать сессию можно с наведения мыши;
|
|
152
|
+
* на телефоне наведения нет, а одиночное касание сразу открывало диалог, и
|
|
153
|
+
* добраться до действий было нечем. Первый тап выбирает строку: подсветка,
|
|
154
|
+
* высота 44 и кнопки действий (меню, архив, закрепление). Второй тап открывает
|
|
155
|
+
* диалог. Кнопки — 32 px: три по 44 в строку шириной 256 не помещаются, но сама
|
|
156
|
+
* строка остаётся крупной целью, а действия доступны с первого касания.
|
|
157
|
+
*/
|
|
158
|
+
[role=treeitem][data-dshm-picked]{position:relative!important;min-height:2.75rem!important;background:color-mix(in srgb,var(--dshm-ink,#ffffff) 9%,transparent)!important;border-radius:.5rem!important;padding-right:5.25rem!important}
|
|
159
|
+
|
|
160
|
+
[data-dshm-picked] :is([class$="_rowActions"], [class*="_rowActions "]){position:absolute!important;right:.25rem!important;top:50%!important;transform:translateY(-50%)!important;display:inline-flex!important;align-items:center!important;gap:.125rem!important;flex:none!important;background:var(--dshm-surface,#1b1b1c)!important;border-radius:.5rem!important;padding-left:.25rem!important;z-index:2!important}
|
|
161
|
+
|
|
162
|
+
[data-dshm-picked] :is([class$="_rowActions"], [class*="_rowActions "]) button{width:2rem!important;height:2rem!important;min-width:2rem!important}
|
|
163
|
+
|
|
164
|
+
/* Время у выбранной строки уступает место действиям: название важнее. */
|
|
165
|
+
[data-dshm-picked] :is([class$="_time"], [class*="_time "]){display:none!important}
|
|
166
|
+
|
|
167
|
+
:is([class$="_sessionOverflowButton"], [class*="_sessionOverflowButton "]){min-height:2.75rem!important}
|
|
168
|
+
|
|
169
|
+
/* Боковая панель: бренд, свернуть, поиск, строки дерева. */
|
|
170
|
+
:is([class$="_brand"], [class*="_brand "]){min-height:2.75rem!important}
|
|
171
|
+
|
|
172
|
+
:is([class$="_toggle"], [class*="_toggle "]),:is([class$="_searchButton"], [class*="_searchButton "]){width:2.75rem!important;height:2.75rem!important}
|
|
173
|
+
|
|
174
|
+
:is([class$="_list"], [class*="_list "]) [role=treeitem]{min-height:2.75rem!important}
|
|
175
|
+
|
|
176
|
+
/* ── 3. ЧАТ: ШАПКА И ЛЕНТА СООБЩЕНИЙ ─────────────────────────────────────────────
|
|
177
|
+
* Шапка может адресоваться только шапке чата: признак, который есть только у неё,
|
|
178
|
+
* публикует сам клиент — `data-conversation-header-leading` на ведущем блоке (он же
|
|
179
|
+
* используется для перетаскивания окна). Без этой привязки правило накрывало все
|
|
180
|
+
* шестнадцать компонентов с собственным `.header` — от полосы очереди до шапок
|
|
181
|
+
* диалогов. Название сессии занимает две строки: полное имя требует 311 px при
|
|
182
|
+
* доступных 203, а порог в 203 px давал не заголовок, а его начало.
|
|
183
|
+
*/
|
|
184
|
+
|
|
185
|
+
/* Шапка начиналась с y = 0, то есть под системной строкой: замер показал
|
|
186
|
+
* `header` 0,0 360x76 при безопасной зоне 37. Название сессии уезжало под часы,
|
|
187
|
+
* а кнопка меню ложилась поверх заголовка. Теперь это обычная мобильная шапка:
|
|
188
|
+
* безопасная зона сверху, фиксированная высота, место слева под кнопку.
|
|
189
|
+
*
|
|
190
|
+
* Правило адресуется ОДНОЙ шапке — шапке чата, и только ей.
|
|
191
|
+
*
|
|
192
|
+
* Раньше здесь стоял `:is([class$="_header"], [class*="_header "])` без привязки, и под него попадали все
|
|
193
|
+
* шестнадцать компонентов интерфейса, у которых есть собственный `.header`:
|
|
194
|
+
* заголовок полосы очереди (36 px → 89), шапка настроек (54 → 89), заголовки
|
|
195
|
+
* блоков вызова инструментов в переписке, заголовок списка файлов, шапки
|
|
196
|
+
* диалогов выбора каталога, входа в учётную запись и справки по горячим
|
|
197
|
+
* клавишам. Каждый из них получал 37 px мёртвого отступа сверху и высоту 89 px.
|
|
198
|
+
* Признак, который есть только у шапки чата, публикует сам клиент:
|
|
199
|
+
* `data-conversation-header-leading` на ведущем блоке (он же используется для
|
|
200
|
+
* перетаскивания окна). У пустой сессии заголовка нет, но ведущий блок есть —
|
|
201
|
+
* проверка селектора на живой странице это подтвердила.
|
|
202
|
+
*/
|
|
203
|
+
/* Шапка приложения (ConversationHeader) всегда помечена data-window-drag; это
|
|
204
|
+
* стабильный признак, в отличие от :has(leading) и вариантов blank/sessionless,
|
|
205
|
+
* которые клиент меняет по состоянию. Безопасная зона и высота задаются один раз
|
|
206
|
+
* для всех состояний шапки, чтобы при загрузке сессии она не «прыгала». */
|
|
207
|
+
header[data-window-drag]:has([data-conversation-header-leading]){padding-top:calc(env(safe-area-inset-top) + .625rem)!important;height:calc(3.375rem + env(safe-area-inset-top))!important;box-sizing:border-box!important}
|
|
208
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]){display:flex!important;align-items:center!important}
|
|
209
|
+
|
|
210
|
+
/* Заголовок сессии должен занимать оставшееся место.
|
|
211
|
+
*
|
|
212
|
+
* Замер показал: `titleCluster` — 0 px, `crumb` — 16 px, то есть название было сжато
|
|
213
|
+
* до невидимости, и в шапке оставались только иконки. Шапка — flex, поэтому заголовку
|
|
214
|
+
* нужно разрешить расти и обрезать длинное имя многоточием, а не сжимать в ноль.
|
|
215
|
+
*
|
|
216
|
+
* Область правила — та же шапка чата: `_titleRow` есть ещё и в карточках плагинов, и
|
|
217
|
+
* без привязки отступ 52 px сдвигал каждую карточку вправо и обрезал её хвост.
|
|
218
|
+
*/
|
|
219
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_titleRow"], [class*="_titleRow "]){padding-left:3.25rem!important;padding-right:.25rem!important;flex:1 1 auto!important;min-width:0!important;height:100%!important;align-items:center!important;overflow:hidden!important}
|
|
220
|
+
|
|
221
|
+
/* Название сессии — двумя строками.
|
|
222
|
+
*
|
|
223
|
+
* Замер на «Связь десктопа с мобильным приложением»: полное имя требует 311 px,
|
|
224
|
+
* а на строку оставалось 203 — обрезалось до 65 %. Порог в 203 px давал не
|
|
225
|
+
* заголовок, а его начало. Две строки по 14 px занимают 40 px при высоте шапки
|
|
226
|
+
* 52 px (89 — вместе с безопасной зоной), поэтому полное имя помещается без
|
|
227
|
+
* роста шапки и без наезда на что-либо. Длинные имена, которые не влезают и в
|
|
228
|
+
* две строки, по-прежнему обрезаются многоточием.
|
|
229
|
+
*/
|
|
230
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_titleCluster"], [class*="_titleCluster "]){flex:1 1 auto!important;min-width:0!important;max-width:none!important}
|
|
231
|
+
|
|
232
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_crumbs"], [class*="_crumbs "]){flex:1 1 auto!important;min-width:0!important;overflow:visible!important}
|
|
233
|
+
|
|
234
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_crumbSeg"], [class*="_crumbSeg "]){flex:1 1 auto!important;min-width:0!important}
|
|
235
|
+
|
|
236
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_crumb"], [class*="_crumb "]), header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_crumbCurrent"], [class*="_crumbCurrent "]){max-width:100%!important;overflow:hidden!important;white-space:normal!important;display:-webkit-box!important;-webkit-box-orient:vertical!important;-webkit-line-clamp:2!important;text-overflow:ellipsis!important;line-height:1.2!important;max-height:2.4em!important;word-break:break-word!important}
|
|
237
|
+
|
|
238
|
+
/* Режим и вкладки — настольные понятия: «Standard mode» и вкладки «Chat»/«Trajectory»
|
|
239
|
+
* занимали вторую строку и вытесняли переписку. Вкладка одна, режим не выбирают.
|
|
240
|
+
*
|
|
241
|
+
* Скрываем их ТОЛЬКО в шапке чата. Без привязки правило накрывало ещё два нужных
|
|
242
|
+
* места: шапку карточки вопроса (кнопки «свернуть», «закрыть» и «Взять время» при
|
|
243
|
+
* обратном отсчёте) и шапку списка сессий («Добавить рабочую область» и фильтры).
|
|
244
|
+
* Замер: именно эти группы пропадали на телефоне; с привязкой к шапке чата
|
|
245
|
+
* (data-conversation-header-leading) они остаются.
|
|
246
|
+
*/
|
|
247
|
+
header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_headerActions"], [class*="_headerActions "]), header:is([class$="_header"], [class*="_header "]):has([data-conversation-header-leading]) :is([class$="_tabs"], [class*="_tabs "]){display:none!important}
|
|
248
|
+
|
|
249
|
+
:is([class$="_scrollBody"], [class*="_scrollBody "]){padding-top:0!important}
|
|
250
|
+
|
|
251
|
+
/* Пустое состояние.
|
|
252
|
+
*
|
|
253
|
+
* Замер: заголовок 78,263 197x32, бейдж «Предварительная версия» 95,301 163x20 — смещён
|
|
254
|
+
* на 17 px вправо от заголовка и прижат к нему на 6 px. Выглядит как случайно
|
|
255
|
+
* приклеенная плашка. Разводим по вертикали и центруем по одной оси с заголовком.
|
|
256
|
+
*/
|
|
257
|
+
:is([class$="_previewBadge"], [class*="_previewBadge "]){margin-top:.625rem!important;align-self:center!important}
|
|
258
|
+
|
|
259
|
+
[data-actions-reveal] :is([class$="_action"], [class*="_action "]){width:2.75rem!important;height:2.75rem!important}
|
|
260
|
+
|
|
261
|
+
/* ── 4. КОМПОЗЕР И ОЧЕРЕДЬ СООБЩЕНИЙ ─────────────────────────────────────────────
|
|
262
|
+
* Композер стоит у нижнего края и не уезжает под клавиатуру: приложение учитывает
|
|
263
|
+
* клавиатуру само, а отступ безопасной зоны — слой. Кнопки «+» и «Отправить» были
|
|
264
|
+
* 28 × 28 и 34 × 34 при шрифте ввода 14 px — для пальца мелко; вид не меняем,
|
|
265
|
+
* растим зону нажатия псевдоэлементом, поле поднимаем до 16 px. Строка статистики
|
|
266
|
+
* скрыта статически: любое перестроение в момент фокуса сбрасывает его (замер —
|
|
267
|
+
* фокус ставился и через 150 мс возвращался к BODY, клавиатура закрывалась).
|
|
268
|
+
* Очередь стоит над композером: заголовок 36 px поднимаем до 44, у списка убираем
|
|
269
|
+
* горизонтальную прокрутку, кнопки строки растим вверх и вниз.
|
|
270
|
+
*/
|
|
271
|
+
|
|
272
|
+
:is([class$="_composerSeat"], [class*="_composerSeat "]){padding-bottom:calc(env(safe-area-inset-bottom) + .25rem)!important}
|
|
273
|
+
|
|
274
|
+
/* Строка статистики на телефоне скрыта всегда, а не только при открытой клавиатуре.
|
|
275
|
+
*
|
|
276
|
+
* Сначала она пряталась по высоте окна — и это ломало ввод: клавиатура открывается,
|
|
277
|
+
* правило срабатывает, вёрстка перестраивается, и Android WebView сбрасывает фокус
|
|
278
|
+
* с поля. Замер: фокус ставился и через 150 мс возвращался к `BODY`, клавиатура
|
|
279
|
+
* закрывалась. Любое перестроение в момент фокуса имеет ту же цену, поэтому прячем
|
|
280
|
+
* один раз при загрузке.
|
|
281
|
+
*/
|
|
282
|
+
|
|
283
|
+
/* Композер.
|
|
284
|
+
*
|
|
285
|
+
* Замер: кнопки «+» 28x28 и «Отправить» 34x34, шрифт ввода 14 px. Для пальца это мелко:
|
|
286
|
+
* Android просит 44, а 14 px на телефоне ещё и просит приблизить. Кнопки растут зоной
|
|
287
|
+
* нажатия (вид не меняется), поле — до 16 px.
|
|
288
|
+
*/
|
|
289
|
+
[class*="_composerStack"] button{position:relative}
|
|
290
|
+
|
|
291
|
+
[class*="_composerStack"] button::after{content:'';position:absolute;inset:-6px}
|
|
292
|
+
|
|
293
|
+
/* Чипы композера (план, только чтение, модель) — это <select>, а не <button>;
|
|
294
|
+
* замер: 28 px высоты и 13 px шрифта, пальцем не попасть. */
|
|
295
|
+
[class*="_composerStack"] select{min-height:2.75rem!important;font-size:1rem!important}
|
|
296
|
+
|
|
297
|
+
/* Поле ввода опознаётся по атрибуту редактора: у клиента своя обёртка композера
|
|
298
|
+
* (`_card`/`_scroll`/`_grow`), и поиск по имени контейнера её не находит.
|
|
299
|
+
*/
|
|
300
|
+
[data-lexical-editor="true"]{font-size:1rem!important;line-height:1.45!important}
|
|
301
|
+
|
|
302
|
+
[data-queue-dock] :is([class$="_header"], [class*="_header "]){min-height:2.75rem!important}
|
|
303
|
+
|
|
304
|
+
/* Список очереди: у родных строк ширина на пиксель больше контейнера, и под
|
|
305
|
+
* сообщениями рисуется горизонтальная полоса прокрутки. Она крадёт 9 px высоты
|
|
306
|
+
* у полосы, которая и без того отнимает место у переписки. По горизонтали тут
|
|
307
|
+
* прокручивать нечего: строка — это текст и три кнопки. */
|
|
308
|
+
[data-queue-dock] :is([class$="_list"], [class*="_list "]){overflow-x:hidden!important}
|
|
309
|
+
|
|
310
|
+
/* Кнопки строки («изменить», «удалить», «вмешаться») — 28 × 28. Вид оставляем,
|
|
311
|
+
* зону нажатия растим псевдоэлементом вверх и вниз: по горизонтали соседние
|
|
312
|
+
* кнопки стоят через 10 px, и расширять их в стороны значило бы делить касания. */
|
|
313
|
+
[data-queue-dock] :is([class$="_action"], [class*="_action "]){position:relative!important}
|
|
314
|
+
|
|
315
|
+
[data-queue-dock] :is([class$="_action"], [class*="_action "])::after{content:'';position:absolute;inset:-.5rem -.25rem}
|
|
316
|
+
|
|
317
|
+
/* Крестик вложения — 18×18 у любого типа (картинка и файл используют разные
|
|
318
|
+
* обёртки: `_imageItem` и `_item`). Замер: у файла зона была ~30 px, палец
|
|
319
|
+
* промахивался. Общее правило: сама кнопка 18 px, зона нажатия — 44 через ::after. */
|
|
320
|
+
html[data-dshm-theme] :is([class$="_remove"], [class*="_remove "]){position:relative!important}
|
|
321
|
+
|
|
322
|
+
html[data-dshm-theme] :is([class$="_remove"], [class*="_remove "])::after{content:''!important;position:absolute!important;inset:-.8125rem!important}
|
|
323
|
+
|
|
324
|
+
/* Композер: «+», микрофон, отправка. */
|
|
325
|
+
[class*="_composerStack"] :is([class$="_add"], [class*="_add "]), [class*="_composerStack"] :is([class$="_primary"], [class*="_primary "]){min-width:2.75rem!important;min-height:2.75rem!important}
|
|
326
|
+
|
|
327
|
+
/* Строка статистики хода под композером: три значения не помещаются в 321 px
|
|
328
|
+
* при 16 px и обрезаются по «…». Ширины пузырей задаёт клиент (112 + 132 + 53),
|
|
329
|
+
* поэтому уменьшаем только шрифт: в те же ширины влезает больше текста, а
|
|
330
|
+
* раскладка и переносы остаются клиентскими (попытка снять max-width развалила
|
|
331
|
+
* строку — пузыри наехали друг на друга). */
|
|
332
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]){font-size:.75rem!important}
|
|
333
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button,
|
|
334
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) [class*="_label"]{font-size:.75rem!important}
|
|
335
|
+
|
|
336
|
+
/* Триггеры выпадающих меню: доступ к рабочей области, модель, микрофон — 28 px. */
|
|
337
|
+
:is([class$="_trigger"], [class*="_trigger "]){min-width:2.75rem!important;min-height:2.75rem!important}
|
|
338
|
+
|
|
339
|
+
/* Нижняя панель — горизонтальный скролл-док под большой палец.
|
|
340
|
+
*
|
|
341
|
+
* Киллер-фича: в панель помещается сколь угодно много инструментов, а не только
|
|
342
|
+
* статистика. Док листается пальцем с мягкой остановкой, края подсказывают
|
|
343
|
+
* прокрутку градиентом, нажатия пружинят. Анимация шторок — с мягким входом.
|
|
344
|
+
*/
|
|
345
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]){
|
|
346
|
+
overflow-x:auto!important; overflow-y:hidden!important;
|
|
347
|
+
flex-wrap:nowrap!important; justify-content:flex-start!important;
|
|
348
|
+
-webkit-overflow-scrolling:touch;
|
|
349
|
+
scrollbar-width:none;
|
|
350
|
+
gap:.5rem!important; padding:.25rem .5rem!important;
|
|
351
|
+
min-height:3.5rem!important;
|
|
352
|
+
mask-image:linear-gradient(to right,transparent 0,#000 .75rem,#000 calc(100% - .75rem),transparent 100%);
|
|
353
|
+
-webkit-mask-image:linear-gradient(to right,transparent 0,#000 .75rem,#000 calc(100% - .75rem),transparent 100%);
|
|
354
|
+
}
|
|
355
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock])::-webkit-scrollbar{display:none}
|
|
356
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock])[data-dshm-scroll="start"]{
|
|
357
|
+
mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 1.25rem),transparent 100%);
|
|
358
|
+
-webkit-mask-image:linear-gradient(to right,#000 0,#000 calc(100% - 1.25rem),transparent 100%);
|
|
359
|
+
}
|
|
360
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock])[data-dshm-scroll="end"]{
|
|
361
|
+
mask-image:linear-gradient(to right,transparent 0,#000 1.25rem,#000 100%);
|
|
362
|
+
-webkit-mask-image:linear-gradient(to right,transparent 0,#000 1.25rem,#000 100%);
|
|
363
|
+
}
|
|
364
|
+
/* Клиентские кнопки статистики лежат в span-якорях нулевой ширины: после
|
|
365
|
+
* превращения дока в скролл-контейнер они перестали занимать место и наезжали
|
|
366
|
+
* друг на друга. Якорь должен быть шириной с кнопку. */
|
|
367
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) [data-composer-stat]{
|
|
368
|
+
width:auto!important; min-width:2.75rem!important; height:2.75rem!important;
|
|
369
|
+
display:inline-flex!important; align-items:center!important; flex:0 0 auto!important;
|
|
370
|
+
}
|
|
371
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button,
|
|
372
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) .dshm-tool{
|
|
373
|
+
transition:transform .14s cubic-bezier(.2,.8,.2,1), background-color .18s ease, color .18s ease;
|
|
374
|
+
}
|
|
375
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button:active,
|
|
376
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) .dshm-tool:active{transform:scale(.92)}
|
|
377
|
+
|
|
378
|
+
/* Нижняя строка статистики — панель иконок, а не подписи.
|
|
379
|
+
*
|
|
380
|
+
* Владелец продукта: подробные подписи «Ходов: 1, шагов: 6 · 249 токенов/с ·
|
|
381
|
+
* попадание в кэш» на телефоне не нужны и занимают всю строку; нужны кнопки-
|
|
382
|
+
* инструменты. Клиент уже даёт кнопки с полной статистикой в aria-label и
|
|
383
|
+
* открывает по нажатию диалог «Статистика сессии» — оставляем их, но прячем
|
|
384
|
+
* подписи и делаем квадратными 44 px. Сюда же переносим кнопку «Команда агентов»
|
|
385
|
+
* (на телефоне она спрятана в шапке), чтобы инструменты были под большим пальцем.
|
|
386
|
+
*/
|
|
387
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]){gap:.375rem!important}
|
|
388
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button{
|
|
389
|
+
width:2.75rem!important; min-width:2.75rem!important;
|
|
390
|
+
height:2.75rem!important; min-height:2.75rem!important;
|
|
391
|
+
padding:0!important; display:inline-flex!important;
|
|
392
|
+
align-items:center!important; justify-content:center!important;
|
|
393
|
+
border-radius:.75rem!important; flex:0 0 auto!important;
|
|
394
|
+
}
|
|
395
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button [class*="_label"],
|
|
396
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button [class*="_sep"]{display:none!important}
|
|
397
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) button svg{width:1.25rem!important;height:1.25rem!important}
|
|
398
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) [class*="_root"]{min-width:2.75rem!important;font-size:.75rem!important}
|
|
399
|
+
/* Инструменты дока — такие же лёгкие иконки, как системные кнопки статистики:
|
|
400
|
+
* без рамок и плотных плашек, чтобы не рябило в глазах. */
|
|
401
|
+
.dshm-tool{
|
|
402
|
+
width:2.75rem; height:2.75rem; display:inline-flex; align-items:center; justify-content:center;
|
|
403
|
+
flex:0 0 auto; padding:0; border-radius:.75rem;
|
|
404
|
+
border:0; background:transparent; color:var(--dshm-muted,rgba(255,255,255,.78));
|
|
405
|
+
cursor:pointer; -webkit-tap-highlight-color:transparent;
|
|
406
|
+
transition:background-color .16s ease, color .16s ease, transform .14s cubic-bezier(.2,.8,.2,1);
|
|
407
|
+
}
|
|
408
|
+
.dshm-tool svg{width:1.25rem;height:1.25rem;opacity:.86}
|
|
409
|
+
.dshm-tool:hover,.dshm-tool:focus-visible{background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff)}
|
|
410
|
+
.dshm-tool:active{transform:scale(.92);background:var(--dshm-raised,#26262a)}
|
|
411
|
+
.dshm-tool[aria-expanded="true"]{background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff)}
|
|
412
|
+
/* Пока открыт левый ящик, правая панель/вкладки/журнал скрыты: никаких слоёв. */
|
|
413
|
+
[data-dshm-under-drawer="1"]{visibility:hidden!important}
|
|
414
|
+
|
|
415
|
+
/* Свёрнутый док: остаются сетка и шеврон, высота плавно уменьшается. */
|
|
416
|
+
@keyframes dshm-dock-in{
|
|
417
|
+
from{opacity:0;transform:translateY(.5rem)}
|
|
418
|
+
to{opacity:1;transform:none}
|
|
419
|
+
}
|
|
420
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock])[data-dshm-enter="1"]{animation:dshm-dock-in .22s cubic-bezier(.2,.8,.2,1)}
|
|
421
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]){transition:max-height .24s ease,min-height .24s ease,padding .24s ease}
|
|
422
|
+
html[data-dshm-dock-collapsed="1"] :is([data-composer-dock="true"], [data-dshm-composer-dock]){
|
|
423
|
+
max-height:2.75rem!important; min-height:2.75rem!important;
|
|
424
|
+
overflow:hidden!important; padding-top:.125rem!important; padding-bottom:.125rem!important;
|
|
425
|
+
}
|
|
426
|
+
html[data-dshm-dock-collapsed="1"] :is([data-composer-dock="true"], [data-dshm-composer-dock]) > *:not([data-dshm-grid]):not(.dshm-dock-toggle){
|
|
427
|
+
display:none!important;
|
|
428
|
+
}
|
|
429
|
+
html[data-dshm-dock-collapsed="1"] :is([data-composer-dock="true"], [data-dshm-composer-dock]) .dshm-dock-toggle{margin-left:auto}
|
|
430
|
+
.dshm-dock-toggle{
|
|
431
|
+
position:sticky!important; right:0; z-index:6;
|
|
432
|
+
background:var(--dshm-surface,#1b1b1c)!important;
|
|
433
|
+
box-shadow:-.5rem 0 .75rem rgba(0,0,0,.35);
|
|
434
|
+
}
|
|
435
|
+
.dshm-dock-toggle svg{transition:transform .2s ease}
|
|
436
|
+
html[data-dshm-dock-collapsed="1"] :is([data-composer-dock="true"], [data-dshm-composer-dock]) .dshm-dock-toggle svg{transform:rotate(180deg)}
|
|
437
|
+
html[data-dshm-dock-collapsed="1"] :is([data-composer-dock="true"], [data-dshm-composer-dock]){display:none!important}
|
|
438
|
+
|
|
439
|
+
/* Перетаскивание инструмента в доке: кнопка приподнимается, остальные остаются на месте. */
|
|
440
|
+
.dshm-tool.dshm-dragging{
|
|
441
|
+
transform:scale(1.08); z-index:5; opacity:.95;
|
|
442
|
+
box-shadow:0 .25rem .875rem rgba(0,0,0,.45);
|
|
443
|
+
transition:none!important;
|
|
444
|
+
}
|
|
445
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock])[data-dshm-dragging="1"]{scroll-behavior:auto;cursor:grabbing}
|
|
446
|
+
|
|
447
|
+
.dshm-tool:focus, .dshm-tool:focus-visible{outline:none!important}
|
|
448
|
+
.dshm-tool:not([aria-expanded="true"]):focus{background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff)}
|
|
449
|
+
.dshm-tool{position:relative;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;touch-action:none}
|
|
450
|
+
/* Живое состояние дока: идёт ход — сетка подсвечена, контекст заполняется —
|
|
451
|
+
* кольцо меняет цвет, завершение мигает. */
|
|
452
|
+
[data-dshm-busy="1"] [data-dshm-grid]{
|
|
453
|
+
box-shadow:inset 0 0 0 1px var(--dshm-accent,#6b8afd),0 0 .75rem rgba(107,138,253,.45)!important;
|
|
454
|
+
}
|
|
455
|
+
[data-dshm-context="warn"] [data-dshm-context-tool]{box-shadow:inset 0 0 0 1px #e0a52a!important}
|
|
456
|
+
[data-dshm-context="crit"] [data-dshm-context-tool]{box-shadow:inset 0 0 0 1px #e05a4f!important}
|
|
457
|
+
[data-dshm-done="1"] [data-dshm-grid]{animation:dshm-done 1.1s ease-out}
|
|
458
|
+
@keyframes dshm-done{0%{box-shadow:inset 0 0 0 1px var(--dshm-accent,#6b8afd),0 0 0 0 rgba(107,138,253,.65)}100%{box-shadow:inset 0 0 0 1px var(--dshm-accent,#6b8afd),0 0 0 .75rem rgba(107,138,253,0)}}
|
|
459
|
+
|
|
460
|
+
/* Сетка всех инструментов: свайп вверх по доку или кнопка-сетка. */
|
|
461
|
+
.dshm-grid-scrim{position:fixed;inset:0;z-index:980;background:rgba(0,0,0,.5);opacity:0;transition:opacity .18s ease}
|
|
462
|
+
.dshm-grid-scrim[data-dshm-show="1"]{opacity:1}
|
|
463
|
+
.dshm-grid{
|
|
464
|
+
position:fixed;left:0;right:0;bottom:0;z-index:990;
|
|
465
|
+
display:flex;flex-direction:column;max-height:82vh;
|
|
466
|
+
border-radius:1rem 1rem 0 0;border-top:1px solid var(--dshm-line,rgba(255,255,255,.14));
|
|
467
|
+
background:var(--dshm-surface,#16181c);box-shadow:0 -.75rem 2rem rgba(0,0,0,.45);
|
|
468
|
+
padding:2.25rem .75rem calc(env(safe-area-inset-bottom) + .75rem);
|
|
469
|
+
box-sizing:border-box;transform:translateY(105%);transition:transform .22s cubic-bezier(.16,1,.3,1);
|
|
470
|
+
}
|
|
471
|
+
.dshm-grid[data-dshm-show="1"]{transform:none}
|
|
472
|
+
.dshm-grid::before{content:'';position:absolute;top:.7rem;left:50%;transform:translateX(-50%);width:2.25rem;height:.25rem;border-radius:999px;background:var(--dshm-line,rgba(255,255,255,.2))}
|
|
473
|
+
.dshm-grid-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}
|
|
474
|
+
.dshm-grid-title{font-size:1.0625rem;font-weight:600;color:var(--dshm-ink,#fff);flex:1 1 auto}
|
|
475
|
+
.dshm-grid-close{width:2.75rem;height:2.75rem;display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:.75rem;background:transparent;color:var(--dshm-ink,#fff);font-size:1.4rem;cursor:pointer}
|
|
476
|
+
.dshm-grid-search{
|
|
477
|
+
width:100%;height:2.75rem;margin:0 0 .5rem;padding:0 .875rem;box-sizing:border-box;
|
|
478
|
+
border-radius:.75rem;border:1px solid var(--dshm-line,rgba(255,255,255,.14));
|
|
479
|
+
background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff);font:inherit;font-size:1rem;
|
|
480
|
+
}
|
|
481
|
+
.dshm-grid-cells{
|
|
482
|
+
display:grid;grid-template-columns:repeat(auto-fill,minmax(5.25rem,1fr));
|
|
483
|
+
gap:.5rem;overflow-y:auto;overscroll-behavior:contain;padding:.125rem 0 .25rem;
|
|
484
|
+
}
|
|
485
|
+
.dshm-grid-cell{
|
|
486
|
+
display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.375rem;
|
|
487
|
+
min-height:5rem;padding:.5rem .25rem;box-sizing:border-box;
|
|
488
|
+
border:1px solid var(--dshm-line,rgba(255,255,255,.12));border-radius:.875rem;
|
|
489
|
+
background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff);
|
|
490
|
+
font:inherit;font-size:.75rem;line-height:1.15;text-align:center;cursor:pointer;
|
|
491
|
+
transition:transform .12s ease,background-color .16s ease;
|
|
492
|
+
}
|
|
493
|
+
.dshm-grid-cell:active{transform:scale(.96)}
|
|
494
|
+
.dshm-grid-cell svg{width:1.375rem;height:1.375rem}
|
|
495
|
+
.dshm-grid-cell[data-dshm-hidden="1"]{display:none}
|
|
496
|
+
.dshm-grid-cell{position:relative}
|
|
497
|
+
.dshm-grid-cell[data-dshm-dock-hidden="1"]{opacity:.55}
|
|
498
|
+
.dshm-grid-cell[data-dshm-dock-hidden="1"]::after{
|
|
499
|
+
content:'+'; position:absolute; top:.2rem; right:.35rem;
|
|
500
|
+
font-size:.9rem; line-height:1; color:var(--dshm-accent,#6b8afd);
|
|
501
|
+
}
|
|
502
|
+
.dshm-grid[data-dshm-edit="1"] .dshm-grid-cell{opacity:.92}
|
|
503
|
+
.dshm-grid[data-dshm-edit="1"] .dshm-grid-cell[data-dshm-dock-hidden="1"]{opacity:.5}
|
|
504
|
+
.dshm-grid[data-dshm-edit="1"] .dshm-grid-cell::before{
|
|
505
|
+
content:'✓'; position:absolute; inset:0; display:flex; align-items:center; justify-content:center;
|
|
506
|
+
border-radius:.875rem; background:rgba(0,0,0,.35); font-size:1.4rem; color:#fff; opacity:0;
|
|
507
|
+
}
|
|
508
|
+
.dshm-grid[data-dshm-edit="1"] .dshm-grid-cell:not([data-dshm-dock-hidden="1"])::before{opacity:1}
|
|
509
|
+
.dshm-grid-edit{
|
|
510
|
+
height:2.75rem; padding:0 .75rem; border-radius:.75rem; border:1px solid var(--dshm-line,rgba(255,255,255,.14));
|
|
511
|
+
background:var(--dshm-raised,#26262a); color:var(--dshm-ink,#fff); font:inherit; font-size:.8125rem; cursor:pointer;
|
|
512
|
+
}
|
|
513
|
+
.dshm-grid-edit[data-dshm-active="1"]{background:var(--dshm-accent,#6b8afd);border-color:transparent;color:#fff}
|
|
514
|
+
.dshm-grid-reset{display:none}
|
|
515
|
+
.dshm-grid[data-dshm-edit="1"] .dshm-grid-reset{display:inline-flex;align-items:center}
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
.dshm-grid-empty{padding:1rem;color:var(--dshm-muted,rgba(255,255,255,.6));font-size:.875rem}
|
|
519
|
+
|
|
520
|
+
/* Первый запуск: одна подсказка, что панель листается и раскрывается. */
|
|
521
|
+
.dshm-dock-hint{
|
|
522
|
+
position:fixed;z-index:960;left:50%;transform:translateX(-50%);
|
|
523
|
+
bottom:calc(env(safe-area-inset-bottom) + 6.5rem);
|
|
524
|
+
padding:.5rem .875rem;border-radius:999px;
|
|
525
|
+
border:1px solid var(--dshm-line,rgba(255,255,255,.16));
|
|
526
|
+
background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff);
|
|
527
|
+
font-size:.8125rem;line-height:1.2;white-space:nowrap;
|
|
528
|
+
box-shadow:0 .375rem 1.25rem rgba(0,0,0,.4);
|
|
529
|
+
opacity:0;transition:opacity .25s ease;pointer-events:none;
|
|
530
|
+
}
|
|
531
|
+
.dshm-dock-hint[data-dshm-show="1"]{opacity:1}
|
|
532
|
+
|
|
533
|
+
/* Завершение, пока человек не в чате: точка «есть готовый ответ» на сетке. */
|
|
534
|
+
[data-dshm-dock-hidden="1"]{display:none!important}
|
|
535
|
+
:is([data-composer-dock="true"], [data-dshm-composer-dock]) [data-dshm-dock-hidden="1"]{display:none!important}
|
|
536
|
+
[data-dshm-unread="1"] [data-dshm-grid]{position:relative}
|
|
537
|
+
[data-dshm-unread="1"] [data-dshm-grid]::after{
|
|
538
|
+
content:''; position:absolute; top:.15rem; right:.15rem; width:.5rem; height:.5rem;
|
|
539
|
+
border-radius:999px; background:#57c26a; box-shadow:0 0 0 2px var(--dshm-surface,#16181c);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/* Бегущие фоновые задачи: бейдж пульсирует. */
|
|
543
|
+
[data-dshm-running="1"] .dshm-badge{animation:dshm-pulse 1.6s ease-in-out infinite}
|
|
544
|
+
@keyframes dshm-pulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.18);opacity:.75}}
|
|
545
|
+
|
|
546
|
+
/* Ручка шторки: за неё шторка закрывается свайпом вниз. */
|
|
547
|
+
.dshm-sheet-handle{
|
|
548
|
+
position:absolute;top:0;left:0;right:0;height:2.5rem;z-index:3;
|
|
549
|
+
touch-action:none;cursor:grab;
|
|
550
|
+
}
|
|
551
|
+
.dshm-sheet-handle::before{
|
|
552
|
+
content:'';position:absolute;top:.7rem;left:50%;transform:translateX(-50%);
|
|
553
|
+
width:2.25rem;height:.25rem;border-radius:999px;background:var(--dshm-line,rgba(255,255,255,.2));
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
/* Подсказка по долгому нажатию: иконки в доке не подписаны, а знать, что это,
|
|
557
|
+
* нужно. Показывается над кнопкой и гаснет при отпускании. */
|
|
558
|
+
.dshm-tip{
|
|
559
|
+
position:fixed; z-index:1200; transform:translate(-50%,-100%);
|
|
560
|
+
max-width:80vw; padding:.375rem .625rem; border-radius:.5rem;
|
|
561
|
+
border:1px solid var(--dshm-line,rgba(255,255,255,.16));
|
|
562
|
+
background:var(--dshm-raised,#26262a); color:var(--dshm-ink,#fff);
|
|
563
|
+
font-size:.75rem; line-height:1.2; white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
|
|
564
|
+
pointer-events:none; opacity:0; transition:opacity .12s ease;
|
|
565
|
+
}
|
|
566
|
+
.dshm-tip[data-dshm-show="1"]{opacity:1}
|
|
567
|
+
|
|
568
|
+
.dshm-notify-hint{
|
|
569
|
+
position:fixed; z-index:1250; left:50%; bottom:calc(env(safe-area-inset-bottom) + 5.5rem);
|
|
570
|
+
transform:translateX(-50%); max-width:calc(100vw - 2rem); box-sizing:border-box;
|
|
571
|
+
padding:.5rem .875rem; border-radius:.75rem; border:1px solid var(--dshm-line,rgba(255,255,255,.16));
|
|
572
|
+
background:var(--dshm-raised,#26262a); color:var(--dshm-ink,#fff); font:inherit; font-size:.8125rem;
|
|
573
|
+
text-align:left; cursor:pointer; box-shadow:0 .75rem 2rem rgba(0,0,0,.45);
|
|
574
|
+
}
|
|
575
|
+
.dshm-badge{
|
|
576
|
+
position:absolute; top:-.2rem; right:-.2rem; min-width:1rem; height:1rem;
|
|
577
|
+
padding:0 .2rem; border-radius:999px; box-sizing:border-box;
|
|
578
|
+
background:var(--dshm-accent,#6b8afd); color:#fff;
|
|
579
|
+
font-size:.625rem; line-height:1rem; font-weight:600; text-align:center;
|
|
580
|
+
pointer-events:none;
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
|
|
584
|
+
/* Панели «Команда агентов», «Субагенты», «Фоновые задачи» клиент рисует
|
|
585
|
+
* выпадашками, привязанными к скрытой кнопке в шапке: они появлялись в левом
|
|
586
|
+
* верхнем углу, без прокрутки и без кнопки закрытия. На телефоне это нижние
|
|
587
|
+
* шторки: во всю ширину, до 78vh, со своей прокруткой и ручкой. */
|
|
588
|
+
.dshm-sheet-scrim{
|
|
589
|
+
position:fixed; inset:0; z-index:999; background:rgba(0,0,0,.45);
|
|
590
|
+
opacity:0; transition:opacity .2s ease; pointer-events:auto;
|
|
591
|
+
}
|
|
592
|
+
.dshm-sheet-scrim[data-dshm-show="1"]{opacity:1}
|
|
593
|
+
[data-dshm-sheet]{
|
|
594
|
+
position:fixed!important; left:0!important; right:0!important; bottom:0!important; top:auto!important;
|
|
595
|
+
width:100%!important; max-width:none!important; height:auto!important;
|
|
596
|
+
max-height:78vh!important;
|
|
597
|
+
border-radius:1rem 1rem 0 0!important;
|
|
598
|
+
border:0!important; border-top:1px solid var(--dshm-line,rgba(255,255,255,.14))!important;
|
|
599
|
+
background:var(--dshm-surface,#16181c)!important;
|
|
600
|
+
box-shadow:0 -.75rem 2rem rgba(0,0,0,.45)!important;
|
|
601
|
+
z-index:1000!important;
|
|
602
|
+
overflow:hidden!important;
|
|
603
|
+
padding-top:2.5rem!important;
|
|
604
|
+
padding-bottom:calc(env(safe-area-inset-bottom) + 2rem)!important;
|
|
605
|
+
outline:0!important;
|
|
606
|
+
animation:dshm-sheet-in .22s cubic-bezier(.16,1,.3,1);
|
|
607
|
+
transition:transform .28s cubic-bezier(.2,1.15,.3,1);
|
|
608
|
+
}
|
|
609
|
+
/* Прокручивается содержимое, а не сама шторка: иначе кнопка закрытия уезжает. */
|
|
610
|
+
[data-dshm-sheet] > *:not(.dshm-sheet-close){
|
|
611
|
+
max-height:calc(78vh - 3.25rem)!important;
|
|
612
|
+
overflow-y:auto!important; overflow-x:hidden!important;
|
|
613
|
+
}
|
|
614
|
+
@keyframes dshm-sheet-in{from{transform:translateY(40%);opacity:.6}to{transform:none;opacity:1}}
|
|
615
|
+
[data-dshm-sheet] > *{max-width:none!important}
|
|
616
|
+
[data-dshm-sheet] [class*="_body"],[data-dshm-sheet] [class*="_list"]{
|
|
617
|
+
max-height:calc(78vh - 3rem)!important; overflow-y:auto!important;
|
|
618
|
+
}
|
|
619
|
+
.dshm-sheet-close{
|
|
620
|
+
position:absolute; top:.375rem; right:.5rem; z-index:5;
|
|
621
|
+
width:2.75rem; height:2.75rem; display:inline-flex; align-items:center; justify-content:center;
|
|
622
|
+
border:0; border-radius:.75rem; background:transparent; color:var(--dshm-ink,#fff);
|
|
623
|
+
font:inherit; font-size:1.25rem; cursor:pointer;
|
|
624
|
+
}
|
|
625
|
+
.dshm-sheet-close::before{content:'×';line-height:1}
|
|
626
|
+
|
|
627
|
+
/* Кнопка сворачивания ящика — внизу панели, над строкой учётной записи. */
|
|
628
|
+
/* Сворачивание ящика — обычная строка в подвале меню, а не плавающая карточка
|
|
629
|
+
* поверх списка сессий (иначе меню выглядит как два слоя). */
|
|
630
|
+
.dshm-collapse-row{
|
|
631
|
+
display:flex; align-items:center; gap:.625rem; width:100%; min-height:2.75rem;
|
|
632
|
+
box-sizing:border-box; padding:.375rem .5rem; margin-top:.25rem;
|
|
633
|
+
border:0; border-radius:.5rem; background:transparent;
|
|
634
|
+
color:var(--dshm-muted,rgba(255,255,255,.78)); font:inherit; font-size:.875rem;
|
|
635
|
+
cursor:pointer; text-align:left; -webkit-tap-highlight-color:transparent;
|
|
636
|
+
}
|
|
637
|
+
.dshm-collapse-row:hover,.dshm-collapse-row:focus-visible{background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff)}
|
|
638
|
+
.dshm-collapse-row svg{width:1.25rem;height:1.25rem;flex:0 0 auto}
|
|
639
|
+
|
|
640
|
+
/* Верхнюю кнопку «Свернуть боковую панель» уводим вниз: на телефоне до неё
|
|
641
|
+
* не дотянуться большим пальцем, а внизу есть место. */
|
|
642
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]) button:is([class$="_toggle"], [class*="_toggle "])[aria-label]:not([data-dshm-collapse]){display:none!important}
|
|
643
|
+
|
|
644
|
+
/* «…» в шапке чата дублирует две редкие команды (скачать журнал, отзыв); на
|
|
645
|
+
* телефоне её место нужно заголовку. Действия остаются в настольной версии. */
|
|
646
|
+
header[class*="_header"] button:is([class$="_moreButton"], [class*="_moreButton "]){display:none!important}
|
|
647
|
+
|
|
648
|
+
/* ── 5. КАРТОЧКА ВОПРОСА АГЕНТА И PLAN REVIEW ────────────────────────────────────
|
|
649
|
+
* Без штатного мобильного слоя карточка приходит в настольной вёрстке: замер на
|
|
650
|
+
* телефоне — сама карточка 353 × 496, но опции уезжают выше её края (y = 223 при
|
|
651
|
+
* верхней границе 256), кнопки «Пропустить»/«Отправить» выходят за правый край
|
|
652
|
+
* (x = 158…366 при ширине 353), шапка вопроса обрезана. Карточка — во всю ширину,
|
|
653
|
+
* шапка видна, список опций прокручивается отдельно, кнопки — двумя колонками по
|
|
654
|
+
* 44 px. У plan review разметка другая (полоса шапки, сводка и подвал — три div без
|
|
655
|
+
* атрибутов), поэтому его раскладка описана отдельно. Компонент штатного плагина
|
|
656
|
+
* `dsh-mobile-question-fixes` тоже одевает карточку — его правки перебиваются
|
|
657
|
+
* точечно, специфичностью выше.
|
|
658
|
+
*/
|
|
659
|
+
|
|
660
|
+
[data-question-key],[data-plan-review-key]{box-sizing:border-box!important;width:100%!important;height:auto!important;min-width:0!important;flex:none!important;align-self:flex-end!important;padding:6px max(10px,env(safe-area-inset-left)) max(10px,env(safe-area-inset-bottom)) max(10px,env(safe-area-inset-right))!important}
|
|
661
|
+
|
|
662
|
+
[data-question-key]>section,[data-plan-review-key]>section{width:100%!important;height:auto!important;min-height:0!important;max-width:none!important;max-height:min(68dvh,520px)!important;border-radius:16px!important;display:flex!important;flex-direction:column!important;overflow:hidden!important}
|
|
663
|
+
|
|
664
|
+
/* Шапка и подвал карточки — фиксированной высоты, середина прокручивается.
|
|
665
|
+
* Замер: без этого секция 520 px содержала 127 + 385 + 98 = 610 px и уезжала
|
|
666
|
+
* внутрь себя — кнопки «Пропустить»/«Отправить» оказывались за нижним краем. */
|
|
667
|
+
[data-question-key]>section>header, [data-question-key]>section>footer{flex:0 0 auto!important}
|
|
668
|
+
|
|
669
|
+
/* У карточки вопроса тело помечено data-question-scroll. У plan review разметка
|
|
670
|
+
* другая: полоса шапки, сводка и подвал — три div без атрибутов. Поэтому общее
|
|
671
|
+
* правило сужено до вопроса, а plan review получает свою раскладку ниже. */
|
|
672
|
+
[data-question-key]>section>div{flex:1 1 auto!important;min-height:0!important;max-height:none!important;overflow:auto!important}
|
|
673
|
+
|
|
674
|
+
[data-question-scroll]{overscroll-behavior:contain;scroll-padding-bottom:12px}
|
|
675
|
+
|
|
676
|
+
/* У plan review ровно три div: полоса, сводка, подвал. Сводка не прокручивается
|
|
677
|
+
* (заголовок и двухстрочный абзац с обрезкой), поэтому ничего не растягиваем и не
|
|
678
|
+
* скроллим — только держим подвал целиком в карточке. */
|
|
679
|
+
[data-plan-review-key]>section>div{flex:0 0 auto!important}
|
|
680
|
+
|
|
681
|
+
[data-question-key]>section>header{display:flex!important;visibility:visible!important;flex:none!important;gap:8px!important;padding:12px 8px 4px 14px!important}
|
|
682
|
+
|
|
683
|
+
[data-question-key]>section>header h2{min-width:0!important;overflow-wrap:anywhere!important;font-size:1rem!important;line-height:1.4!important}
|
|
684
|
+
|
|
685
|
+
[data-question-key]>section>header button{min-width:2.5rem!important;min-height:2.5rem!important}
|
|
686
|
+
|
|
687
|
+
[data-question-key] [role=radio],[data-question-key] [role=checkbox]{min-height:3rem!important;touch-action:manipulation}
|
|
688
|
+
|
|
689
|
+
[data-question-key]>section>footer{display:grid!important;grid-template-columns:auto minmax(0,1fr)!important;align-items:center!important;flex:none!important;gap:6px 8px!important;margin-top:4px!important;padding:6px 10px 10px!important}
|
|
690
|
+
|
|
691
|
+
[data-question-key]>section>footer>:last-child{grid-column:1/-1!important;display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;width:100%!important;gap:8px!important}
|
|
692
|
+
|
|
693
|
+
[data-question-key]>section>footer>:last-child button{width:100%!important;min-height:2.75rem!important}
|
|
694
|
+
|
|
695
|
+
[data-plan-review-key]>section>div:last-child{display:grid!important;grid-template-columns:1fr!important;gap:8px!important;padding:8px 12px 10px!important}
|
|
696
|
+
|
|
697
|
+
[data-plan-review-key]>section>div:last-child>div:last-child{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr))!important;width:100%!important;gap:8px!important}
|
|
698
|
+
|
|
699
|
+
/* Первую (outline) не растягиваем на всю строку: в разметке порядок «Запросить
|
|
700
|
+
* изменения» → «Подтвердить», и полноширинная outline-кнопка оставляла primary
|
|
701
|
+
* полклетки. Две равные колонки, primary справа. */
|
|
702
|
+
[data-plan-review-key]>section>div:last-child>div:last-child>button{width:100%!important;min-height:2.75rem!important}
|
|
703
|
+
|
|
704
|
+
[data-plan-review-key]>section>div:last-child button{width:100%!important;min-height:2.75rem!important}
|
|
705
|
+
|
|
706
|
+
/* Компонент штатного плагина `dsh-mobile-question-fixes` тоже одевает карточку
|
|
707
|
+
* вопроса — но по-своему: он делает прокручиваемой всю секцию, а тело карточки
|
|
708
|
+
* оставляет фиксированным. На нашей странице это значит, что кнопки
|
|
709
|
+
* «Пропустить»/«Отправить» уезжают ниже видимой части, и человек их не видит.
|
|
710
|
+
* Перебиваем его точечно (у его правил !important, поэтому берём специфичностью
|
|
711
|
+
* выше): шапка и подвал фиксированы, прокручивается только список опций.
|
|
712
|
+
*/
|
|
713
|
+
html[data-dshm-theme] [data-question-key] > section:has(> [data-question-scroll]){display:flex!important;flex-direction:column!important;overflow:hidden!important}
|
|
714
|
+
|
|
715
|
+
html[data-dshm-theme] [data-question-key] > section > div[data-question-scroll]{flex:1 1 auto!important;min-height:0!important;max-height:none!important;overflow-y:auto!important}
|
|
716
|
+
|
|
717
|
+
html[data-dshm-theme] [data-question-key] > section > header, html[data-dshm-theme] [data-question-key] > section > footer{flex:0 0 auto!important}
|
|
718
|
+
|
|
719
|
+
/* Ссылка «Открыть план целиком» в полосе plan review: 169×40, до 44 не хватает
|
|
720
|
+
* двух пикселей с каждой стороны — расширяем зону нажатия, не двигая полосу. */
|
|
721
|
+
:is([class$="_reviewLink"], [class*="_reviewLink "]){position:relative!important}
|
|
722
|
+
|
|
723
|
+
:is([class$="_reviewLink"], [class*="_reviewLink "])::after{content:'';position:absolute;inset:-.125rem -.25rem}
|
|
724
|
+
|
|
725
|
+
[data-question-key] :is([class$="_pager"], [class*="_pager "]) button{min-width:2.75rem!important;min-height:2.75rem!important}
|
|
726
|
+
|
|
727
|
+
/* ── 6. ПЛАГИНЫ И АВТОЗАДАЧИ: ЗАГОЛОВКИ, ДЕТАЛИ, МЕЛКИЕ ЦЕЛИ ─────────────────────
|
|
728
|
+
* Вторичные экраны (плагины, автозадачи) начинались с самого верха: заголовок
|
|
729
|
+
* «Плагины» в точке 24,28 — под системной строкой и под нашей кнопкой меню. Им
|
|
730
|
+
* нужна безопасная зона и место слева под меню. Аудит нашёл на телефоне цели
|
|
731
|
+
* высотой 20–24 px: подпись карточки плагина («Открыть Субагент» 60 × 20),
|
|
732
|
+
* переключатель плагина (36 × 20), кнопка «О плагинах» (20 × 20) и поле поиска
|
|
733
|
+
* задач (260 × 24 при обёртке 36). Ниже зона нажатия доведена до 44 px; где можно —
|
|
734
|
+
* псевдоэлементом, чтобы вид и вёрстка не менялись. В конце секции — общие
|
|
735
|
+
* правила для тулбаров и полей страниц.
|
|
736
|
+
*/
|
|
737
|
+
|
|
738
|
+
/* Вторичные экраны (плагины, автозадачи, настройки) начинались с самого верха:
|
|
739
|
+
* замер показал заголовок «Плагины» в точке 24,28 — под системной строкой и под нашей
|
|
740
|
+
* кнопкой меню. Им тоже нужна безопасная зона и место слева под меню.
|
|
741
|
+
*/
|
|
742
|
+
:is([class$="_pageHeading"], [class*="_pageHeading "]){padding-top:calc(env(safe-area-inset-top) + .5rem)!important;padding-left:3.25rem!important;box-sizing:border-box!important}
|
|
743
|
+
|
|
744
|
+
/* Страница плагина (детальный экран).
|
|
745
|
+
*
|
|
746
|
+
* Замер: кнопка «К списку плагинов» — 312 × 15 в точке y = 28, то есть в полосе
|
|
747
|
+
* системной строки (37 px): касание забирает система, а сама цель в четыре раза
|
|
748
|
+
* ниже пальцевого минимума. Верх детального экрана получает безопасную зону,
|
|
749
|
+
* зона нажатия крошек растёт псевдоэлементом без сдвига вёрстки.
|
|
750
|
+
*/
|
|
751
|
+
:is([class$="_detailTop"], [class*="_detailTop "]){padding-top:calc(env(safe-area-inset-top) + .25rem)!important;padding-left:3.25rem!important;box-sizing:border-box!important}
|
|
752
|
+
|
|
753
|
+
:is([class$="_detailTop"], [class*="_detailTop "]) :is([class$="_crumb"], [class*="_crumb "]){position:relative!important}
|
|
754
|
+
|
|
755
|
+
:is([class$="_detailTop"], [class*="_detailTop "]) :is([class$="_crumb"], [class*="_crumb "])::after{content:'';position:absolute;inset:-.9375rem -.5rem}
|
|
756
|
+
|
|
757
|
+
/* Угол шапки — настольные кнопки: правый ящик, новая вкладка, разделить, полный экран.
|
|
758
|
+
* На телефоне они занимали место справа от названия сессии и ловили нажатия.
|
|
759
|
+
* Замер: «Открыть правую боковую панель» стояла в точке 320,11 при экране 360.
|
|
760
|
+
*/
|
|
761
|
+
:is([class$="_headerCorner"], [class*="_headerCorner "]){display:none!important}
|
|
762
|
+
|
|
763
|
+
/* Карточки плагинов. Заголовок — кнопка 20 px внутри карточки, которую
|
|
764
|
+
* целиком открывает `::after` самой кнопки; собственный прямоугольник всё
|
|
765
|
+
* равно должен быть взрослым, потому что в него целятся и с клавиатуры, и
|
|
766
|
+
* вспомогательными технологиями. padding + отрицательный margin дают 44 px
|
|
767
|
+
* без роста карточки: замер после правки — карточка та же, заголовок на месте.
|
|
768
|
+
* Привязка к `_cardLink`: класс `_cardOpen` есть ещё у карточки плана и у
|
|
769
|
+
* карточки создания расписания, и им такой высоты не нужно.
|
|
770
|
+
*/
|
|
771
|
+
:is([class$="_cardLink"], [class*="_cardLink "]) :is([class$="_cardOpen"], [class*="_cardOpen "]){display:inline-flex!important;align-items:center!important;box-sizing:border-box!important;min-height:2.75rem!important;padding-block:.75rem!important;margin-block:-.75rem!important}
|
|
772
|
+
|
|
773
|
+
/* «О плагинах» — круглая кнопка сведений в заголовке страницы. */
|
|
774
|
+
:is([class$="_infoButton"], [class*="_infoButton "]){position:relative!important}
|
|
775
|
+
|
|
776
|
+
:is([class$="_infoButton"], [class*="_infoButton "])::after{content:'';position:absolute;inset:-.75rem}
|
|
777
|
+
|
|
778
|
+
/* Переключатель включения плагина: 36 × 20. В сторону расширяем мало — рядом
|
|
779
|
+
* край карточки, — но и 44 px по высоте достаточно, чтобы не прицеливаться.
|
|
780
|
+
* Класс у переключателя статический (`_switch_<hash>_<line>`), поэтому опора —
|
|
781
|
+
* роль, которую он и так объявляет вспомогательным технологиям.
|
|
782
|
+
*/
|
|
783
|
+
[role="switch"]{position:relative!important}
|
|
784
|
+
|
|
785
|
+
[role="switch"]::after{content:'';position:absolute;inset:-.75rem -.25rem}
|
|
786
|
+
|
|
787
|
+
/* Поле поиска задач на странице «Автоматические задачи».
|
|
788
|
+
*
|
|
789
|
+
* Замер: обёртка `.searchField` 36 px, поле ввода внутри — 24. Для пальца это
|
|
790
|
+
* мелко, а курсор в поле ввода ещё и 14 px шрифтом просит приближения на
|
|
791
|
+
* Android. Поднимаем поле до 44 и шрифт до 16; область прокрутки страницы —
|
|
792
|
+
* `_listPane`, чтобы не задеть одноимённое поле в справке по клавишам.
|
|
793
|
+
*/
|
|
794
|
+
:is([class$="_listPane"], [class*="_listPane "]) :is([class$="_searchField"], [class*="_searchField "]){height:2.75rem!important;box-sizing:border-box!important}
|
|
795
|
+
|
|
796
|
+
:is([class$="_listPane"], [class*="_listPane "]) :is([class$="_searchField"], [class*="_searchField "]) > :first-child{height:100%!important}
|
|
797
|
+
|
|
798
|
+
:is([class$="_listPane"], [class*="_listPane "]) :is([class$="_searchField"], [class*="_searchField "]) input{height:100%!important;font-size:1rem!important;line-height:1.4!important}
|
|
799
|
+
|
|
800
|
+
/* Кнопка очистки внутри поля — 28 px и прижата вправо; поднимаем до 44. */
|
|
801
|
+
:is([class$="_listPane"], [class*="_listPane "]) :is([class$="_searchField"], [class*="_searchField "]) button{width:2.75rem!important;height:2.75rem!important;margin-right:0!important}
|
|
802
|
+
|
|
803
|
+
/* Детали автозадачи: полоса вкладок «Правила»/«Записи» и кнопки «Связанная
|
|
804
|
+
* сессия», «Действия», «Закрыть подробности» (28×28) лежали на y = 8…15 — в зоне
|
|
805
|
+
* системной строки (37 px): часы печатались поверх вкладок, а закрытие касанием
|
|
806
|
+
* не срабатывало. Полоса получает безопасную зону, отступ слева под плавающее
|
|
807
|
+
* меню и переносится на две строки, чтобы три кнопки получили по 44 px.
|
|
808
|
+
*/
|
|
809
|
+
:is([class$="_detailTabsBar"], [class*="_detailTabsBar "]){padding-top:calc(env(safe-area-inset-top) + .25rem)!important;padding-left:3.25rem!important;padding-right:.5rem!important;padding-bottom:.25rem!important;height:auto!important;min-height:calc(2.75rem + env(safe-area-inset-top))!important;box-sizing:border-box!important;flex-wrap:wrap!important;align-items:center!important;gap:.25rem!important}
|
|
810
|
+
|
|
811
|
+
[class*="_detailTabsBar"] button{min-width:2.75rem!important;min-height:2.75rem!important}
|
|
812
|
+
|
|
813
|
+
[class*="_detailTab"]{min-height:2.75rem!important;display:inline-flex!important;align-items:center!important}
|
|
814
|
+
|
|
815
|
+
/* Список компонентов на детали плагина: строка 308 px делилась на иконку 41,
|
|
816
|
+
* описание 116, статус 68 и тумблер 36 — описанию оставалось 116 px, и оно
|
|
817
|
+
* переносилось по 1–2 слова. Разрешаем перенос: иконка и описание занимают первую
|
|
818
|
+
* строку, статус и тумблер уходят на следующую.
|
|
819
|
+
*/
|
|
820
|
+
:is([class$="_rowLine"], [class*="_rowLine "]){flex-wrap:wrap!important}
|
|
821
|
+
|
|
822
|
+
:is([class$="_rowMain"], [class*="_rowMain "]){flex:1 1 calc(100% - 57px)!important;min-width:0!important}
|
|
823
|
+
|
|
824
|
+
:is([class$="_rowLine"], [class*="_rowLine "]) :is([class$="_rowState"], [class*="_rowState "]){margin-left:calc(41px + 1rem)!important}
|
|
825
|
+
|
|
826
|
+
:is([class$="_moreBack"], [class*="_moreBack "]){min-height:2.75rem!important}
|
|
827
|
+
|
|
828
|
+
/* Автозадачи и плагины: кнопки создания/добавления/фильтров 28–32 px. */
|
|
829
|
+
:is([class$="_newButton"], [class*="_newButton "]),:is([class$="_addPrimary"], [class*="_addPrimary "]),:is([class$="_addMore"], [class*="_addMore "]),:is([class$="_groupMore"], [class*="_groupMore "]){min-height:2.75rem!important}
|
|
830
|
+
|
|
831
|
+
[class*="_filterTab"]{min-height:2.75rem!important;display:inline-flex!important;align-items:center!important}
|
|
832
|
+
|
|
833
|
+
/* Детали плагина/задачи: поля ввода. */
|
|
834
|
+
:is([class$="_detail"], [class*="_detail "]) :is(input,select,textarea){min-height:2.75rem!important;font-size:1rem!important}
|
|
835
|
+
|
|
836
|
+
:is([class$="_guideToggle"], [class*="_guideToggle "]),:is([class$="_registryToggle"], [class*="_registryToggle "]),:is([class$="_registryOption"], [class*="_registryOption "]){min-height:2.75rem!important;display:inline-flex!important;align-items:center!important}
|
|
837
|
+
|
|
838
|
+
:is([class$="_registryOption"], [class*="_registryOption "]) [role=radio],:is([class$="_registryOption"], [class*="_registryOption "]) input[type=radio]{min-width:2.75rem!important;min-height:2.75rem!important}
|
|
839
|
+
|
|
840
|
+
:is([class$="_pageIntro"], [class*="_pageIntro "]) button{min-width:2.75rem!important;min-height:2.75rem!important}
|
|
841
|
+
|
|
842
|
+
:is([class$="_toolbar"], [class*="_toolbar "]) button{min-width:2.75rem!important;min-height:2.75rem!important}
|
|
843
|
+
|
|
844
|
+
/* Инструменты просмотра diff и селектор файла: 28 px. */
|
|
845
|
+
:is([class$="_tool"], [class*="_tool "]){min-width:2.75rem!important;min-height:2.75rem!important}
|
|
846
|
+
|
|
847
|
+
:is([class$="_selectorButton"], [class*="_selectorButton "]){min-height:2.75rem!important}
|
|
848
|
+
|
|
849
|
+
:is([class$="_toolbar"], [class*="_toolbar "]) input,:is([class$="_toolbar"], [class*="_toolbar "]) select{min-height:2.75rem!important;font-size:1rem!important}
|
|
850
|
+
|
|
851
|
+
/* ── 7. НАСТРОЙКИ, МЕНЮ И ДИАЛОГИ ────────────────────────────────────────────────
|
|
852
|
+
* Пункты меню и списков — 34 px у родных, поля и кнопки закрытия в диалогах и
|
|
853
|
+
* справке по горячим клавишам — 18–28 px. Всё это поднимаем до 44 px, а поля — до
|
|
854
|
+
* 16 px шрифта: мелкий шрифт в поле ввода заставляет Android приближать страницу.
|
|
855
|
+
* Правило `[role=dialog] button` широкое намеренно: диалоги клиента рисуют кнопки
|
|
856
|
+
* своими классами, и без него цели остаются мелкими.
|
|
857
|
+
*/
|
|
858
|
+
|
|
859
|
+
/* Пункты выпадающих меню — 34 px у родных: «Переименовать», «Архивировать»
|
|
860
|
+
* и прочие действия в них жмутся пальцем. 44 — та же мера, что у строк панели. */
|
|
861
|
+
[role=menuitem]{min-height:2.75rem!important}
|
|
862
|
+
|
|
863
|
+
[data-shortcut-modal] :is([class$="_navCell"], [class*="_navCell "]){min-height:2.75rem!important}
|
|
864
|
+
|
|
865
|
+
/* Меню слэш-команд и диалоги: пункты и поля — пальцевого размера.
|
|
866
|
+
* У активного пункта в className два класса (`_item _active`), поэтому суффиксный
|
|
867
|
+
* селектор его не ловил — берём вхождение и только кнопки, чтобы не растянуть
|
|
868
|
+
* служебные span-ы пункта. */
|
|
869
|
+
[role=listbox] button[class*="_item"],[role=menu] button[class*="_item"]{min-height:2.75rem!important}
|
|
870
|
+
|
|
871
|
+
[role=dialog] :is(input,select,textarea),[data-shortcut-modal] :is(input,select,textarea){min-height:2.75rem!important;font-size:1rem!important}
|
|
872
|
+
|
|
873
|
+
[role=dialog] button[class*="_close"],[data-shortcut-modal] button[class*="_close"]{width:2.75rem!important;height:2.75rem!important}
|
|
874
|
+
|
|
875
|
+
/* Настройки на телефоне: клиент рисует двухколоночную модалку — замер 312 × 752,
|
|
876
|
+
* навигация 188 px + содержимое 124 px, из-за чего текст переносится по 1–3 символа.
|
|
877
|
+
* На узком экране панель занимает весь кадр, разделы становятся строкой вкладок
|
|
878
|
+
* сверху, содержимое получает всю ширину и вертикальную прокрутку. */
|
|
879
|
+
@media (max-width: 700px){
|
|
880
|
+
[data-shortcut-modal="settings"]{
|
|
881
|
+
position:fixed!important; inset:0!important;
|
|
882
|
+
width:100%!important; height:100dvh!important;
|
|
883
|
+
max-width:none!important; max-height:100dvh!important;
|
|
884
|
+
margin:0!important; border:0!important; border-radius:0!important;
|
|
885
|
+
padding-top:env(safe-area-inset-top)!important;
|
|
886
|
+
padding-bottom:env(safe-area-inset-bottom)!important;
|
|
887
|
+
box-sizing:border-box!important;
|
|
888
|
+
display:flex!important; flex-direction:column!important;
|
|
889
|
+
background:var(--dshm-surface,#16181c)!important;
|
|
890
|
+
}
|
|
891
|
+
[data-shortcut-modal="settings"] > :is([class$="_nav"], [class*="_nav "]){
|
|
892
|
+
width:100%!important; height:auto!important; flex:0 0 auto!important;
|
|
893
|
+
display:flex!important; flex-direction:column!important;
|
|
894
|
+
border-right:0!important; padding:.5rem .75rem 0!important;
|
|
895
|
+
box-sizing:border-box!important;
|
|
896
|
+
}
|
|
897
|
+
[data-shortcut-modal="settings"] > :is([class$="_nav"], [class*="_nav "]) :is([class$="_navTitle"], [class*="_navTitle "]){
|
|
898
|
+
margin:0 0 .25rem!important; font-size:1.25rem!important; line-height:1.3!important;
|
|
899
|
+
}
|
|
900
|
+
[data-shortcut-modal="settings"] > :is([class$="_nav"], [class*="_nav "]) :is([class$="_navList"], [class*="_navList "]){
|
|
901
|
+
display:flex!important; flex-direction:row!important; flex-wrap:nowrap!important;
|
|
902
|
+
gap:.25rem!important; width:100%!important; overflow-x:auto!important;
|
|
903
|
+
padding-bottom:.375rem!important; scrollbar-width:none;
|
|
904
|
+
border-bottom:1px solid var(--dshm-line,rgba(255,255,255,.12));
|
|
905
|
+
}
|
|
906
|
+
[data-shortcut-modal="settings"] > :is([class$="_nav"], [class*="_nav "]) :is([class$="_navCell"], [class*="_navCell "]){
|
|
907
|
+
flex:0 0 auto!important; width:auto!important; min-width:0!important;
|
|
908
|
+
min-height:2.75rem!important; padding:0 .75rem!important; white-space:nowrap!important;
|
|
909
|
+
}
|
|
910
|
+
[data-shortcut-modal="settings"] > :is([class$="_content"], [class*="_content "]){
|
|
911
|
+
width:100%!important; min-width:0!important; flex:1 1 auto!important;
|
|
912
|
+
overflow-y:auto!important; overflow-x:hidden!important;
|
|
913
|
+
padding:0 .75rem 1rem!important; box-sizing:border-box!important;
|
|
914
|
+
}
|
|
915
|
+
/* Карточки настроек внутри — настольные двухколоночные: аватар 42 px и текстовая
|
|
916
|
+
* колонка, которая в тесной модалке получала ширину 0 и переносила текст по слову.
|
|
917
|
+
* На телефоне карточка становится колонкой, аватар и текст — обычной строкой. */
|
|
918
|
+
[data-shortcut-modal="settings"] :is([class$="_section"], [class*="_section "]){width:100%!important}
|
|
919
|
+
[data-shortcut-modal="settings"] :is([class$="_card"], [class*="_card "]){
|
|
920
|
+
flex-direction:column!important; align-items:stretch!important; gap:.5rem!important;
|
|
921
|
+
width:100%!important; height:auto!important;
|
|
922
|
+
}
|
|
923
|
+
[data-shortcut-modal="settings"] :is([class$="_identity"], [class*="_identity "]){
|
|
924
|
+
flex-direction:row!important; align-items:center!important;
|
|
925
|
+
width:100%!important; height:auto!important; gap:.75rem!important;
|
|
926
|
+
}
|
|
927
|
+
[data-shortcut-modal="settings"] :is([class$="_identityCopy"], [class*="_identityCopy "]){
|
|
928
|
+
width:auto!important; flex:1 1 auto!important; min-width:0!important; height:auto!important;
|
|
929
|
+
}
|
|
930
|
+
[data-shortcut-modal="settings"] :is([class$="_name"], [class*="_name "]),
|
|
931
|
+
[data-shortcut-modal="settings"] :is([class$="_status"], [class*="_status "]){width:auto!important}
|
|
932
|
+
[data-shortcut-modal="settings"] :is([class$="_accountInfo"], [class*="_accountInfo "]){align-self:flex-start!important; width:auto!important}
|
|
933
|
+
|
|
934
|
+
/* Строки настроек с пояснением настольные: текстовая колонка и контрол справа.
|
|
935
|
+
* В тесной модалке пояснению доставалась ширина 48 px (замер: desc 0 px),
|
|
936
|
+
* контрол наезжал на текст. На телефоне строка становится колонкой: пояснение
|
|
937
|
+
* сверху, контрол ниже во всю ширину. */
|
|
938
|
+
[data-shortcut-modal="settings"] :is([class$="_row"], [class*="_row "]):has(:is([class$="_rowText"], [class*="_rowText "])){
|
|
939
|
+
flex-direction:column!important; align-items:stretch!important;
|
|
940
|
+
gap:.5rem!important; height:auto!important; width:100%!important;
|
|
941
|
+
}
|
|
942
|
+
[data-shortcut-modal="settings"] :is([class$="_row"], [class*="_row "]) :is([class$="_rowText"], [class*="_rowText "]){
|
|
943
|
+
width:100%!important; min-width:0!important; max-width:none!important;
|
|
944
|
+
box-sizing:border-box!important; padding-right:0!important;
|
|
945
|
+
}
|
|
946
|
+
[data-shortcut-modal="settings"] :is([class$="_row"], [class*="_row "]) :is([class$="_desc"], [class*="_desc "]){
|
|
947
|
+
width:auto!important; min-width:0!important; max-width:none!important;
|
|
948
|
+
box-sizing:border-box!important; padding-right:0!important;
|
|
949
|
+
}
|
|
950
|
+
[data-shortcut-modal="settings"] :is([class$="_row"], [class*="_row "]):has(:is([class$="_rowText"], [class*="_rowText "])) > :not(:is([class$="_rowText"], [class*="_rowText "])){
|
|
951
|
+
width:100%!important; max-width:none!important; align-self:stretch!important;
|
|
952
|
+
}
|
|
953
|
+
/* Заголовок группы «Встроенные»: кнопка + селект пресета; селект с настольной
|
|
954
|
+
* минимальной шириной выезжал за экран на 36 px. */
|
|
955
|
+
[data-shortcut-modal="settings"] :is([class$="_headerEnd"], [class*="_headerEnd "]){
|
|
956
|
+
flex:1 1 auto!important; min-width:0!important; max-width:100%!important;
|
|
957
|
+
justify-content:flex-end!important;
|
|
958
|
+
}
|
|
959
|
+
[data-shortcut-modal="settings"] :is([class$="_headerEnd"], [class*="_headerEnd "]) :is(select,button){
|
|
960
|
+
min-width:0!important; max-width:100%!important;
|
|
961
|
+
}
|
|
962
|
+
[data-shortcut-modal="settings"] select{max-width:100%!important}
|
|
963
|
+
|
|
964
|
+
|
|
965
|
+
|
|
966
|
+
[data-shortcut-modal="settings"] > :is([class$="_content"], [class*="_content "]) :is([class$="_header"], [class*="_header "]){
|
|
967
|
+
width:100%!important; min-height:2.75rem!important; position:sticky!important; top:0!important;
|
|
968
|
+
display:flex!important; align-items:center!important; justify-content:flex-end!important;
|
|
969
|
+
background:var(--dshm-surface,#16181c)!important; z-index:2!important;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
973
|
+
/* Диалог «Добавить плагин»: текстовые ссылки-кнопки и выбор реестра — 15–28 px. */
|
|
974
|
+
[role=dialog] button{min-height:2.75rem!important}
|
|
975
|
+
|
|
976
|
+
/* ── 8. ПРАВАЯ ПАНЕЛЬ: ФАЙЛЫ, ТЕРМИНАЛ, БРАУЗЕР, ЖУРНАЛ ──────────────────────────
|
|
977
|
+
* Содержимое панели на телефоне полезно, а настольные оконные операции — нет.
|
|
978
|
+
* Замер при открытой панели: сверху появлялись «Разделить» (28 × 28), «Выйти из
|
|
979
|
+
* полноэкранного режима» и «Новая вкладка» — этого на телефоне не существует; и
|
|
980
|
+
* весь ряд лежал в полосе системной строки (y = 10), где касания забирает система.
|
|
981
|
+
* Оставляем закрытие панели ниже безопасной зоны и вход в панель — 44 × 44.
|
|
982
|
+
* Классы правой панели статические (`_tabHostHeader_<hash>_<line>`), поэтому
|
|
983
|
+
* окончание имени тут не работает — ищем вхождение. Тулбары браузера (38 px) и
|
|
984
|
+
* журнала (кнопки 20–24 px, select 11 px) поднимаем до 44 и 16 px шрифта. Высота
|
|
985
|
+
* строк журнала зашита в виртуализацию (`INSPECTOR_ROW_HEIGHT`) — её не меняем,
|
|
986
|
+
* а мелким контролам растим зону нажатия через ::after.
|
|
987
|
+
*/
|
|
988
|
+
|
|
989
|
+
[data-dockkit-split-button],[data-sidebar-right-mode],[class*="_addTab_"]{display:none!important}
|
|
990
|
+
|
|
991
|
+
/* Классы правой панели статические (`_tabHostHeader_<hash>_<line>`), поэтому
|
|
992
|
+
* окончание имени тут не работает — ищем вхождение. */
|
|
993
|
+
[class*="_tabHostHeader_"]{padding-top:env(safe-area-inset-top)!important;box-sizing:border-box!important}
|
|
994
|
+
|
|
995
|
+
/* В настройках правая панель — dockkit-вкладка с собственной полосой
|
|
996
|
+
* `_tabStrip_<hash>_<line>`; её кнопка закрытия лежала на y=10, в зоне системной
|
|
997
|
+
* строки. Полоса получает безопасную зону, как и заголовок вкладок. */
|
|
998
|
+
[class*="_tabStrip_"]{min-height:calc(2.75rem + env(safe-area-inset-top))!important;align-items:center!important;padding-top:env(safe-area-inset-top)!important;box-sizing:border-box!important}
|
|
999
|
+
|
|
1000
|
+
[data-sidebar-right-toggle]{width:2.75rem!important;height:2.75rem!important;min-width:2.75rem!important;display:inline-flex!important;align-items:center!important;justify-content:center!important}
|
|
1001
|
+
|
|
1002
|
+
[data-dockkit-tab]{min-height:2.75rem!important}
|
|
1003
|
+
|
|
1004
|
+
[data-dockkit-tab-close]{width:2.75rem!important;height:2.75rem!important;opacity:1!important}
|
|
1005
|
+
|
|
1006
|
+
[data-files-entry] button{min-height:2.75rem!important}
|
|
1007
|
+
|
|
1008
|
+
[data-sidebar-right-panel] :is([class$="_toolbar"], [class*="_toolbar "]){min-height:2.75rem!important;height:auto!important}
|
|
1009
|
+
|
|
1010
|
+
[data-sidebar-right-panel] :is([class$="_toolbar"], [class*="_toolbar "]) button{min-width:2.75rem!important;min-height:2.75rem!important}
|
|
1011
|
+
|
|
1012
|
+
[data-sidebar-right-panel] :is([class$="_toolbar"], [class*="_toolbar "]) input{height:2.75rem!important;font-size:1rem!important;box-sizing:border-box!important}
|
|
1013
|
+
|
|
1014
|
+
[data-sidebar-right-panel] :is([class$="_toolbar"], [class*="_toolbar "]) select, [data-sidebar-right-panel] :is([class$="_toolbar"], [class*="_toolbar "]) :is([class$="_tool"], [class*="_tool "]){min-height:2.75rem!important;font-size:1rem!important}
|
|
1015
|
+
|
|
1016
|
+
/* Терминал: кнопки строки статуса и нижняя безопасная зона. */
|
|
1017
|
+
[data-sidebar-terminal] :is([class$="_status"], [class*="_status "]) button{min-height:2.75rem!important}
|
|
1018
|
+
|
|
1019
|
+
[data-sidebar-terminal]{padding-bottom:env(safe-area-inset-bottom)!important;box-sizing:border-box!important}
|
|
1020
|
+
|
|
1021
|
+
/* Скрытая настольная кнопка угла убрала единственный видимый вход в правую
|
|
1022
|
+
* панель; после закрытия последней вкладки гид «Начало» было не вернуть без
|
|
1023
|
+
* карточки в чате. Возвращаем только эту кнопку, остальные настольные действия
|
|
1024
|
+
* в углу остаются скрытыми (см. `:is([class$="_headerCorner"], [class*="_headerCorner "])` выше).
|
|
1025
|
+
*/
|
|
1026
|
+
[class*="headerCorner"]:has([data-sidebar-right-expand]){display:flex!important;align-items:center!important}
|
|
1027
|
+
[class*="headerCorner"] button:not([data-sidebar-right-expand]){display:none!important}
|
|
1028
|
+
|
|
1029
|
+
[data-sidebar-right-expand]{display:inline-flex!important;align-items:center!important;justify-content:center!important;width:2.75rem!important;height:2.75rem!important;min-width:2.75rem!important}
|
|
1030
|
+
|
|
1031
|
+
[class*="headerUtilities"] button{width:2.75rem!important;height:2.75rem!important;min-width:2.75rem!important}
|
|
1032
|
+
|
|
1033
|
+
[data-sidebar-right-panel] button[class*="_typeFilterButton"]{position:relative!important}
|
|
1034
|
+
|
|
1035
|
+
[data-sidebar-right-panel] button[class*="_typeFilterButton"]::after, [data-sidebar-right-panel] button[class*="_disclosure"]::after{content:''!important;position:absolute!important;inset:-.85rem!important}
|
|
1036
|
+
|
|
1037
|
+
/* ── 9. ПАНЕЛЬ REMOTE И СЛУЖЕБНЫЕ СТРОКИ ─────────────────────────────────────────
|
|
1038
|
+
* Панель — наш клиентский плагин (`plugin/lib/client.js`), он рисует её
|
|
1039
|
+
* встроенными стилями и общий с настольным приложением. На телефоне её ссылка
|
|
1040
|
+
* «Открыть страницу подключения» — 15 px высотой, а строка «Дополнительно» и того
|
|
1041
|
+
* меньше: палец по ним не попадает. Слой телефона правит только телефон.
|
|
1042
|
+
* Строка «Продолжить в «…»» заменяет inline-стили в JS и держится над композером.
|
|
1043
|
+
*/
|
|
1044
|
+
|
|
1045
|
+
#dshm-remote-panel summary{display:flex!important;align-items:center!important;min-height:2.75rem!important}
|
|
1046
|
+
|
|
1047
|
+
#dshm-remote-panel a, #dshm-remote-panel button{display:inline-flex!important;align-items:center!important;justify-content:center!important;min-height:2.75rem!important}
|
|
1048
|
+
|
|
1049
|
+
/* Строка «Продолжить в «…»» вместо inline-стилей в JS. */
|
|
1050
|
+
.dshm-resume{position:fixed;z-index:45;left:50%;transform:translateX(-50%);bottom:calc(env(safe-area-inset-bottom,0px) + 8.5rem);padding:.5rem .875rem;border-radius:999px;border:1px solid var(--dshm-line,rgba(255,255,255,.14));background:var(--dshm-raised,#26262a);color:var(--dshm-ink,#fff);font:inherit;font-size:.8125rem;cursor:pointer}
|
|
1051
|
+
|
|
1052
|
+
/* ── 10. ПЕРЕОПРЕДЕЛЕНИЯ: ЛАНДШАФТ С ОТКРЫТОЙ КЛАВИАТУРОЙ ────────────────────────
|
|
1053
|
+
* Замер: экран 800 × 360, клавиатура занимает 295 px — WebView остаётся 65 px.
|
|
1054
|
+
* Композер с панелью инструментов и строкой статистики (160 px) уезжал за верхний
|
|
1055
|
+
* край (y = −98), а заголовок диалога перекрывал поле ввода (elementFromPoint в
|
|
1056
|
+
* центре редактора давал titleRow). Оставляем только строку ввода и отправку,
|
|
1057
|
+
* заголовок и плавающее меню в этом состоянии убираем. Блок стоит последним: в
|
|
1058
|
+
* коротком окне его правила должны уступать только более специфичным.
|
|
1059
|
+
*/
|
|
1060
|
+
|
|
1061
|
+
@media (max-height:150px) and (orientation:landscape){
|
|
1062
|
+
|
|
1063
|
+
[class*="_composerStack"] :is([class$="_tools"], [class*="_tools "]), :is([data-composer-dock="true"], [data-dshm-composer-dock]){display:none!important}
|
|
1064
|
+
|
|
1065
|
+
[class*="_composerStack"] :is([class$="_trailing"], [class*="_trailing "]){position:absolute!important;right:.375rem!important;bottom:.125rem!important;width:auto!important}
|
|
1066
|
+
|
|
1067
|
+
[class*="_composerStack"] :is([class$="_trailing"], [class*="_trailing "]) > :not(:last-child){display:none!important}
|
|
1068
|
+
|
|
1069
|
+
[class*="_composerStack"] :is([class$="_scroll"], [class*="_scroll "]){padding-right:3.5rem!important}
|
|
1070
|
+
|
|
1071
|
+
/* У шапки чата бывает второй класс (headerSessionless), поэтому суффикс не
|
|
1072
|
+
* работает — берём вхождение. Второй селектор повторяет более специфичное
|
|
1073
|
+
* правило шапки из основного слоя: в коротком окне оно должно уступить. */
|
|
1074
|
+
header[class*="_header"], header[class*="_header"]:has([data-conversation-header-leading]){display:none!important}
|
|
1075
|
+
|
|
1076
|
+
.dshm-menu{display:none!important}
|
|
1077
|
+
|
|
1078
|
+
}
|
|
1079
|
+
|
|
1080
|
+
/* Первый запуск: короткий брифинг, как пользоваться приложением и панелью. */
|
|
1081
|
+
.dshm-onboard{
|
|
1082
|
+
position:fixed; inset:0; z-index:1300; display:flex; align-items:center; justify-content:center;
|
|
1083
|
+
padding:1.25rem; box-sizing:border-box;
|
|
1084
|
+
background:rgba(0,0,0,.62); backdrop-filter:blur(2px);
|
|
1085
|
+
opacity:0; transition:opacity .22s ease;
|
|
1086
|
+
}
|
|
1087
|
+
.dshm-onboard[data-dshm-show="1"]{opacity:1}
|
|
1088
|
+
.dshm-onboard-card{
|
|
1089
|
+
width:100%; max-width:21rem; box-sizing:border-box;
|
|
1090
|
+
display:flex; flex-direction:column; gap:.75rem;
|
|
1091
|
+
padding:1.25rem; border-radius:1.125rem;
|
|
1092
|
+
border:1px solid var(--dshm-line,rgba(255,255,255,.16));
|
|
1093
|
+
background:var(--dshm-surface,#16181c); color:var(--dshm-ink,#fff);
|
|
1094
|
+
box-shadow:0 1.5rem 4rem rgba(0,0,0,.55);
|
|
1095
|
+
transform:translateY(.75rem) scale(.98); transition:transform .22s cubic-bezier(.16,1,.3,1);
|
|
1096
|
+
}
|
|
1097
|
+
.dshm-onboard[data-dshm-show="1"] .dshm-onboard-card{transform:none}
|
|
1098
|
+
.dshm-onboard-icon{font-size:1.75rem; line-height:1}
|
|
1099
|
+
.dshm-onboard-title{font-size:1.125rem; font-weight:600; line-height:1.25}
|
|
1100
|
+
.dshm-onboard-text{font-size:.875rem; line-height:1.45; opacity:.82; margin:0}
|
|
1101
|
+
.dshm-onboard-foot{display:flex; align-items:center; justify-content:space-between; gap:.5rem; margin-top:.25rem}
|
|
1102
|
+
.dshm-onboard-dots{display:flex; gap:.3rem}
|
|
1103
|
+
.dshm-onboard-dot{width:.4rem; height:.4rem; border-radius:999px; background:rgba(255,255,255,.22)}
|
|
1104
|
+
.dshm-onboard-dot[data-dshm-active="1"]{background:var(--dshm-accent,#6b8afd)}
|
|
1105
|
+
.dshm-onboard-actions{display:flex; gap:.5rem}
|
|
1106
|
+
.dshm-onboard-skip,.dshm-onboard-next{
|
|
1107
|
+
min-height:2.75rem; padding:0 .875rem; border-radius:.75rem; font:inherit; font-size:.875rem; cursor:pointer;
|
|
1108
|
+
}
|
|
1109
|
+
.dshm-onboard-skip{border:0;background:transparent;color:var(--dshm-muted,rgba(255,255,255,.7))}
|
|
1110
|
+
.dshm-onboard-next{border:0;background:var(--dshm-accent,#6b8afd);color:#fff;font-weight:600}
|
|
1111
|
+
.dshm-grid-info{
|
|
1112
|
+
width:2.75rem;height:2.75rem;display:inline-flex;align-items:center;justify-content:center;
|
|
1113
|
+
border:0;border-radius:.75rem;background:transparent;color:var(--dshm-ink,#fff);
|
|
1114
|
+
font:inherit;font-size:1rem;cursor:pointer;
|
|
1115
|
+
}
|
|
1116
|
+
|
|
1117
|
+
/* Уважение к системной настройке «уменьшить движение». */
|
|
1118
|
+
@media (prefers-reduced-motion: reduce){
|
|
1119
|
+
.dshm-tool,.dshm-grid-cell,.dshm-sheet-close,.dshm-menu,.dshm-collapse,
|
|
1120
|
+
.dshm-grid,.dshm-grid-scrim,.dshm-dock-hint,.dshm-tip{transition-duration:.01ms!important;animation-duration:.01ms!important}
|
|
1121
|
+
}
|
|
1122
|
+
|
|
1123
|
+
/* Планшет/ландшафт: та же мобильная панель, но с комфортной шириной.
|
|
1124
|
+
* Телефонные правила не меняются; на широком экране ящик не занимает половину
|
|
1125
|
+
* дисплея, сетка инструментов не растягивается на всю ширину, а брифинг не
|
|
1126
|
+
* выглядит узкой телефонной карточкой. */
|
|
1127
|
+
@media (min-width: 680px){
|
|
1128
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]){width:min(21rem,42vw)!important}
|
|
1129
|
+
.dshm-grid{max-width:42rem;margin-inline:auto}
|
|
1130
|
+
.dshm-grid-cells{grid-template-columns:repeat(auto-fill,minmax(6.25rem,1fr))}
|
|
1131
|
+
.dshm-onboard-card{max-width:24rem}
|
|
1132
|
+
}
|
|
1133
|
+
|
|
1134
|
+
/* Правая панель на телефоне не должна делить экран на две колонки.
|
|
1135
|
+
*
|
|
1136
|
+
* Dockkit рисует вкладки панели как grid из нескольких `_tabCell_`, и при двух
|
|
1137
|
+
* открытых вкладках (например, «Начало» и разговор субагента) на телефоне
|
|
1138
|
+
* получались две колонки по 180 px: чат сжимался в вертикальную полоску.
|
|
1139
|
+
* На узком экране оставляем только активную вкладку на всю ширину.
|
|
1140
|
+
*/
|
|
1141
|
+
@media (max-width: 600px){
|
|
1142
|
+
[data-sidebar-right-panel] [class*="_tabLayout_"]{grid-template-columns:1fr!important}
|
|
1143
|
+
[data-sidebar-right-panel] [class*="_tabCell_"]{display:none!important}
|
|
1144
|
+
[data-sidebar-right-panel] [class*="_tabCell_"]:has([data-dockkit-pane-active="true"]){display:block!important;width:100%!important}
|
|
1145
|
+
}
|
|
1146
|
+
|
|
1147
|
+
|
|
1148
|
+
/* «Открыть в Finder» и меню способов открытия — настольные действия в шапке.
|
|
1149
|
+
* На телефоне они не нужны и занимали место справа от названия сессии; у
|
|
1150
|
+
* пользователя это выглядело как лишняя кнопка «Fider Terminal». Прячем весь
|
|
1151
|
+
* блок утилит; вход в правую панель живёт в headerCorner и остаётся. */
|
|
1152
|
+
:is([class$="_headerUtilities"], [class*="_headerUtilities "]){display:none!important}
|
|
1153
|
+
|
|
1154
|
+
/* Поле поиска по сессиям в мобильной боковой панели.
|
|
1155
|
+
*
|
|
1156
|
+
* Полная подсказка «Поиск по названиям сессий» обрезается между иконкой и
|
|
1157
|
+
* крестиком; JS заменяет её на «Поиск сессий». Крестик в клиенте — 24 px, и
|
|
1158
|
+
* промах по нему попадает в подложку, закрывающую всю панель. Даём ему
|
|
1159
|
+
* полноценные 44 px и невидимую область нажатия вокруг.
|
|
1160
|
+
*/
|
|
1161
|
+
[class*="_searchSlot"] [class*="_clearButton"],
|
|
1162
|
+
button[aria-label="Очистить поиск"],
|
|
1163
|
+
button[aria-label="Clear search"] {
|
|
1164
|
+
width: 2.75rem !important;
|
|
1165
|
+
height: 2.75rem !important;
|
|
1166
|
+
min-width: 2.75rem !important;
|
|
1167
|
+
min-height: 2.75rem !important;
|
|
1168
|
+
position: relative !important;
|
|
1169
|
+
z-index: 5 !important;
|
|
1170
|
+
display: inline-flex !important;
|
|
1171
|
+
align-items: center !important;
|
|
1172
|
+
justify-content: center !important;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
[class*="_searchSlot"] [class*="_clearButton"]::after,
|
|
1176
|
+
button[aria-label="Очистить поиск"]::after,
|
|
1177
|
+
button[aria-label="Clear search"]::after {
|
|
1178
|
+
content: '' !important;
|
|
1179
|
+
position: absolute !important;
|
|
1180
|
+
inset: -.5rem !important;
|
|
1181
|
+
border-radius: 50% !important;
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
/* DDeck plugin manager — настольная точка входа; на телефоне её заменяет
|
|
1185
|
+
* отдельный сценарий подключения второго телефона. */
|
|
1186
|
+
[class*="_footerActions"] button[aria-label="DDeck"] {
|
|
1187
|
+
display: none !important;
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
/* Второй телефон: строка в боковой панели и парольный диалог.
|
|
1191
|
+
* Пароль задаётся на компьютере; телефон только вводит его и показывает
|
|
1192
|
+
* одноразовый QR. Диалог перекрывает страницу, поле — 16 px, чтобы Android
|
|
1193
|
+
* не приближал экран при фокусе.
|
|
1194
|
+
*/
|
|
1195
|
+
.dshm-pair-overlay {
|
|
1196
|
+
position: fixed !important;
|
|
1197
|
+
inset: 0 !important;
|
|
1198
|
+
z-index: 10000 !important;
|
|
1199
|
+
display: flex !important;
|
|
1200
|
+
align-items: center !important;
|
|
1201
|
+
justify-content: center !important;
|
|
1202
|
+
padding: 1rem !important;
|
|
1203
|
+
background: rgba(0, 0, 0, .68) !important;
|
|
1204
|
+
color: #f5f6f8 !important;
|
|
1205
|
+
}
|
|
1206
|
+
|
|
1207
|
+
.dshm-pair-card {
|
|
1208
|
+
width: 100% !important;
|
|
1209
|
+
max-width: 22rem !important;
|
|
1210
|
+
max-height: calc(100% - 2rem) !important;
|
|
1211
|
+
overflow: auto !important;
|
|
1212
|
+
box-sizing: border-box !important;
|
|
1213
|
+
padding: 1rem !important;
|
|
1214
|
+
border: 1px solid #2b2d34 !important;
|
|
1215
|
+
border-radius: 1rem !important;
|
|
1216
|
+
background: #1b1b1c !important;
|
|
1217
|
+
display: flex !important;
|
|
1218
|
+
flex-direction: column !important;
|
|
1219
|
+
gap: .75rem !important;
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
.dshm-pair-title { font-weight: 650 !important; font-size: 1.05rem !important; }
|
|
1223
|
+
.dshm-pair-note { opacity: .72 !important; font-size: .875rem !important; line-height: 1.45 !important; }
|
|
1224
|
+
.dshm-pair-error { min-height: 1.2em !important; color: #ff9b9b !important; font-size: .875rem !important; }
|
|
1225
|
+
|
|
1226
|
+
.dshm-pair-input {
|
|
1227
|
+
width: 100% !important;
|
|
1228
|
+
box-sizing: border-box !important;
|
|
1229
|
+
height: 2.75rem !important;
|
|
1230
|
+
padding: 0 .75rem !important;
|
|
1231
|
+
border: 1px solid #2b2d34 !important;
|
|
1232
|
+
border-radius: .5rem !important;
|
|
1233
|
+
background: #12151c !important;
|
|
1234
|
+
color: #f5f6f8 !important;
|
|
1235
|
+
font: inherit !important;
|
|
1236
|
+
font-size: 1rem !important;
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
.dshm-pair-submit, .dshm-pair-cancel {
|
|
1240
|
+
min-height: 2.75rem !important;
|
|
1241
|
+
padding: 0 .75rem !important;
|
|
1242
|
+
border-radius: .5rem !important;
|
|
1243
|
+
font: inherit !important;
|
|
1244
|
+
cursor: pointer !important;
|
|
1245
|
+
}
|
|
1246
|
+
|
|
1247
|
+
.dshm-pair-submit { border: 1px solid #6b8afd !important; background: #6b8afd !important; color: #fff !important; }
|
|
1248
|
+
.dshm-pair-cancel { border: 1px solid #3a3d46 !important; background: transparent !important; color: #f5f6f8 !important; }
|
|
1249
|
+
.dshm-pair-submit:disabled { opacity: .55 !important; }
|
|
1250
|
+
|
|
1251
|
+
.dshm-pair-qr { align-self: center; width: min(16rem, 70vw); background: #fff; border-radius: .75rem; padding: .5rem; line-height: 0; }
|
|
1252
|
+
.dshm-pair-qr svg { display: block; width: 100%; height: auto; }
|
|
1253
|
+
.dshm-pair-code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 1.35rem; letter-spacing: .18em; text-align: center; }
|
|
1254
|
+
|
|
1255
|
+
/* Поиск по сессиям и клавиатура.
|
|
1256
|
+
*
|
|
1257
|
+
* Когда открывается клавиатура, высота вьюпорта падает с 800 до ~420 px.
|
|
1258
|
+
* Верхние строки панели и футер имеют фиксированную высоту, и `regionArea`
|
|
1259
|
+
* схлопывался в 0: поле поиска оставалось в DOM, но полностью обрезалось, а
|
|
1260
|
+
* экран показывал только «Плагины / Автоматические задачи / Ещё / футер».
|
|
1261
|
+
* Даём области минимальную высоту и разрешаем прокрутку самой панели; поле
|
|
1262
|
+
* поиска и его обёртки растягиваем на 44 px, иначе input (44) обрезался
|
|
1263
|
+
* обёрткой (30).
|
|
1264
|
+
*/
|
|
1265
|
+
:has(> [class*="_regionArea"]) {
|
|
1266
|
+
overflow-y: auto !important;
|
|
1267
|
+
overscroll-behavior: contain !important;
|
|
1268
|
+
}
|
|
1269
|
+
|
|
1270
|
+
[class*="_regionArea"] {
|
|
1271
|
+
min-height: 10rem !important;
|
|
1272
|
+
flex: 0 0 auto !important;
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
:is([class$="_search"], [class*="_search "]) {
|
|
1276
|
+
height: 2.75rem !important;
|
|
1277
|
+
min-height: 2.75rem !important;
|
|
1278
|
+
overflow: visible !important;
|
|
1279
|
+
transition: height .16s ease, min-height .16s ease !important;
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
:is([class$="_searchSlot"], [class*="_searchSlot "]) {
|
|
1283
|
+
height: 2.75rem !important;
|
|
1284
|
+
min-height: 2.75rem !important;
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
:is([class$="_sectionHeader"], [class*="_sectionHeader "]) {
|
|
1288
|
+
height: auto !important;
|
|
1289
|
+
min-height: 2.75rem !important;
|
|
1290
|
+
overflow: visible !important;
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
/* Модалки не должны уходить под системную навигацию Android. */
|
|
1294
|
+
[role=dialog] {
|
|
1295
|
+
max-height: calc(100dvh - env(safe-area-inset-top) - env(safe-area-inset-bottom) - 1rem) !important;
|
|
1296
|
+
margin-bottom: env(safe-area-inset-bottom) !important;
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
/* Поповер настроек рабочих областей прижат к низу окна и уходил под
|
|
1300
|
+
* трёхкнопочную навигацию Android. Поднимаем его над системной панелью;
|
|
1301
|
+
* содержимое при необходимости прокручивается. */
|
|
1302
|
+
[role=menu][class*="_viewOptionsMenu"] {
|
|
1303
|
+
bottom: calc(3.25rem + env(safe-area-inset-bottom, 0px)) !important;
|
|
1304
|
+
max-height: calc(100dvh - 3.25rem - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px)) !important;
|
|
1305
|
+
overflow-y: auto !important;
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
/* Шеврон дока живёт в строке композера рядом с микрофоном и нативными
|
|
1309
|
+
* кнопками, а не внутри самого дока: док можно свернуть, шеврон остаётся на
|
|
1310
|
+
* месте и разворачивает его обратно. Направление стрелки — как у нативных
|
|
1311
|
+
* меню: вверх, когда док открыт, вниз, когда свёрнут. */
|
|
1312
|
+
.dshm-dock-toggle {
|
|
1313
|
+
position: static !important;
|
|
1314
|
+
right: auto !important;
|
|
1315
|
+
flex: 0 0 auto !important;
|
|
1316
|
+
width: 2.75rem !important;
|
|
1317
|
+
height: 2.75rem !important;
|
|
1318
|
+
min-width: 2.75rem !important;
|
|
1319
|
+
min-height: 2.75rem !important;
|
|
1320
|
+
padding: 0 !important;
|
|
1321
|
+
display: inline-flex !important;
|
|
1322
|
+
align-items: center !important;
|
|
1323
|
+
justify-content: center !important;
|
|
1324
|
+
border: 0 !important;
|
|
1325
|
+
border-radius: .65rem !important;
|
|
1326
|
+
background: transparent !important;
|
|
1327
|
+
color: inherit !important;
|
|
1328
|
+
box-shadow: none !important;
|
|
1329
|
+
cursor: pointer !important;
|
|
1330
|
+
-webkit-tap-highlight-color: transparent !important;
|
|
1331
|
+
}
|
|
1332
|
+
|
|
1333
|
+
.dshm-dock-toggle svg {
|
|
1334
|
+
width: 1.25rem !important;
|
|
1335
|
+
height: 1.25rem !important;
|
|
1336
|
+
opacity: .86 !important;
|
|
1337
|
+
transition: transform .18s ease !important;
|
|
1338
|
+
transform: rotate(180deg) !important;
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
html[data-dshm-dock-collapsed="1"] .dshm-dock-toggle svg {
|
|
1342
|
+
transform: rotate(0deg) !important;
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1345
|
+
html[data-dshm-dock-collapsed="1"] :is([data-composer-dock="true"], [data-dshm-composer-dock]) {
|
|
1346
|
+
display: none !important;
|
|
1347
|
+
}
|
|
1348
|
+
|
|
1349
|
+
|
|
1350
|
+
|
|
1351
|
+
/* Шеврон дока — как нативные кнопки композера: иконка + маленькая стрелка,
|
|
1352
|
+
* а не одинокая стрелка. Стрелка поворачивается отдельно. */
|
|
1353
|
+
.dshm-dock-toggle {
|
|
1354
|
+
width: auto !important;
|
|
1355
|
+
min-width: 3.5rem !important;
|
|
1356
|
+
padding: 0 .375rem !important;
|
|
1357
|
+
gap: .125rem !important;
|
|
1358
|
+
display: inline-flex !important;
|
|
1359
|
+
align-items: center !important;
|
|
1360
|
+
justify-content: center !important;
|
|
1361
|
+
}
|
|
1362
|
+
|
|
1363
|
+
.dshm-dock-toggle-icon,
|
|
1364
|
+
.dshm-dock-toggle-arrow {
|
|
1365
|
+
display: inline-flex;
|
|
1366
|
+
align-items: center;
|
|
1367
|
+
justify-content: center;
|
|
1368
|
+
flex: none;
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
.dshm-dock-toggle-icon svg {
|
|
1372
|
+
width: 1rem !important;
|
|
1373
|
+
height: 1rem !important;
|
|
1374
|
+
opacity: .86 !important;
|
|
1375
|
+
transform: none !important;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
.dshm-dock-toggle-arrow svg {
|
|
1379
|
+
width: .75rem !important;
|
|
1380
|
+
height: .75rem !important;
|
|
1381
|
+
opacity: .7 !important;
|
|
1382
|
+
transition: transform .18s ease !important;
|
|
1383
|
+
transform: rotate(180deg) !important;
|
|
1384
|
+
}
|
|
1385
|
+
|
|
1386
|
+
html[data-dshm-dock-collapsed="1"] .dshm-dock-toggle-arrow svg {
|
|
1387
|
+
transform: rotate(0deg) !important;
|
|
1388
|
+
}
|
|
1389
|
+
|
|
1390
|
+
/* Компактная ширина как у нативной кнопки модели: иконка + маленький шеврон.
|
|
1391
|
+
* Если сделать кнопку шире, `trailing` перестаёт помещаться рядом с плюсом и
|
|
1392
|
+
* щитом, композер переносит строку и занимает лишние 56 px по высоте. */
|
|
1393
|
+
.dshm-dock-toggle {
|
|
1394
|
+
width: 2.875rem !important;
|
|
1395
|
+
min-width: 2.875rem !important;
|
|
1396
|
+
max-width: 2.875rem !important;
|
|
1397
|
+
padding: 0 .25rem !important;
|
|
1398
|
+
gap: 0 !important;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
.dshm-dock-toggle-icon svg {
|
|
1402
|
+
width: .875rem !important;
|
|
1403
|
+
height: .875rem !important;
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
.dshm-dock-toggle-arrow svg {
|
|
1407
|
+
width: .5rem !important;
|
|
1408
|
+
height: .5rem !important;
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
/* Generic `[class*="_composerStack"] button::after` расширяет зону нажатия у
|
|
1412
|
+
* всех кнопок на -6 px; у нашей составной кнопки этот псевдоэлемент
|
|
1413
|
+
* растягивался на весь композер и перехватывал все касания. Отключаем его
|
|
1414
|
+
* только у шеврона. */
|
|
1415
|
+
.dshm-dock-toggle::after {
|
|
1416
|
+
content: none !important;
|
|
1417
|
+
display: none !important;
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
/* Композер должен оставаться в одну строку: чуть уменьшаем зазор trailing и
|
|
1421
|
+
* ширину шеврона, чтобы плюс/щит и model/toggle/mic/send поместились рядом. */
|
|
1422
|
+
[class*="_composerStack"] :is([class*="_trailing"]) {
|
|
1423
|
+
gap: .375rem !important;
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
.dshm-dock-toggle {
|
|
1427
|
+
width: 2.75rem !important;
|
|
1428
|
+
min-width: 2.75rem !important;
|
|
1429
|
+
max-width: 2.75rem !important;
|
|
1430
|
+
}
|
|
1431
|
+
|
|
1432
|
+
/* ── Компактная нижняя навигация левой панели ───────────────────────────────
|
|
1433
|
+
* Верхние настольные строки скрываются JS-слоем; внизу одна строка иконок:
|
|
1434
|
+
* аккаунт, автозадачи и «Ещё» (в нём плагины и подключение телефона).
|
|
1435
|
+
*/
|
|
1436
|
+
:is([class$="_sidebarCol"], [class*="_sidebarCol "]) {
|
|
1437
|
+
padding-bottom: calc(3.5rem + env(safe-area-inset-bottom)) !important;
|
|
1438
|
+
}
|
|
1439
|
+
|
|
1440
|
+
[data-dshm-footer-hidden] {
|
|
1441
|
+
display: none !important;
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
.dshm-bottom-nav {
|
|
1445
|
+
position: absolute !important;
|
|
1446
|
+
left: .5rem !important;
|
|
1447
|
+
right: .5rem !important;
|
|
1448
|
+
bottom: calc(env(safe-area-inset-bottom) + .25rem) !important;
|
|
1449
|
+
z-index: 75 !important;
|
|
1450
|
+
display: flex !important;
|
|
1451
|
+
align-items: center !important;
|
|
1452
|
+
justify-content: space-around !important;
|
|
1453
|
+
gap: .25rem !important;
|
|
1454
|
+
height: 3.25rem !important;
|
|
1455
|
+
box-sizing: border-box !important;
|
|
1456
|
+
padding: 0 .25rem !important;
|
|
1457
|
+
border-top: 1px solid var(--dshm-line, rgba(255, 255, 255, .14)) !important;
|
|
1458
|
+
background: var(--dshm-surface, #1b1b1c) !important;
|
|
1459
|
+
}
|
|
1460
|
+
|
|
1461
|
+
.dshm-bottom-button {
|
|
1462
|
+
width: 2.75rem !important;
|
|
1463
|
+
height: 2.75rem !important;
|
|
1464
|
+
min-width: 2.75rem !important;
|
|
1465
|
+
min-height: 2.75rem !important;
|
|
1466
|
+
padding: 0 !important;
|
|
1467
|
+
display: inline-flex !important;
|
|
1468
|
+
align-items: center !important;
|
|
1469
|
+
justify-content: center !important;
|
|
1470
|
+
border: 0 !important;
|
|
1471
|
+
border-radius: .65rem !important;
|
|
1472
|
+
background: transparent !important;
|
|
1473
|
+
color: inherit !important;
|
|
1474
|
+
-webkit-tap-highlight-color: transparent !important;
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
.dshm-bottom-button svg {
|
|
1478
|
+
width: 1.25rem !important;
|
|
1479
|
+
height: 1.25rem !important;
|
|
1480
|
+
opacity: .86 !important;
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1483
|
+
.dshm-more-scrim {
|
|
1484
|
+
position: fixed !important;
|
|
1485
|
+
inset: 0 !important;
|
|
1486
|
+
z-index: 80 !important;
|
|
1487
|
+
border: 0 !important;
|
|
1488
|
+
background: transparent !important;
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1491
|
+
.dshm-more-menu {
|
|
1492
|
+
position: fixed !important;
|
|
1493
|
+
left: .5rem !important;
|
|
1494
|
+
bottom: calc(env(safe-area-inset-bottom) + 4rem) !important;
|
|
1495
|
+
z-index: 90 !important;
|
|
1496
|
+
width: min(18rem, calc(100vw - 1rem)) !important;
|
|
1497
|
+
padding: .375rem !important;
|
|
1498
|
+
box-sizing: border-box !important;
|
|
1499
|
+
border: 1px solid #2b2d34 !important;
|
|
1500
|
+
border-radius: .875rem !important;
|
|
1501
|
+
background: #24262b !important;
|
|
1502
|
+
color: #f5f6f8 !important;
|
|
1503
|
+
box-shadow: 0 .75rem 2rem rgba(0, 0, 0, .45) !important;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
.dshm-more-item {
|
|
1507
|
+
width: 100% !important;
|
|
1508
|
+
min-height: 2.75rem !important;
|
|
1509
|
+
padding: 0 .625rem !important;
|
|
1510
|
+
display: flex !important;
|
|
1511
|
+
align-items: center !important;
|
|
1512
|
+
gap: .625rem !important;
|
|
1513
|
+
border: 0 !important;
|
|
1514
|
+
border-radius: .55rem !important;
|
|
1515
|
+
background: transparent !important;
|
|
1516
|
+
color: inherit !important;
|
|
1517
|
+
font: inherit !important;
|
|
1518
|
+
text-align: left !important;
|
|
1519
|
+
}
|
|
1520
|
+
|
|
1521
|
+
.dshm-more-item svg {
|
|
1522
|
+
width: 1.25rem !important;
|
|
1523
|
+
height: 1.25rem !important;
|
|
1524
|
+
flex: none !important;
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
.dshm-more-item:active {
|
|
1528
|
+
background: rgba(255, 255, 255, .08) !important;
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
.dshm-phone-n {
|
|
1532
|
+
position: relative !important;
|
|
1533
|
+
display: inline-flex !important;
|
|
1534
|
+
align-items: center !important;
|
|
1535
|
+
justify-content: center !important;
|
|
1536
|
+
}
|
|
1537
|
+
|
|
1538
|
+
.dshm-phone-n b {
|
|
1539
|
+
position: absolute !important;
|
|
1540
|
+
top: -.35rem !important;
|
|
1541
|
+
right: -.35rem !important;
|
|
1542
|
+
font-size: .6rem !important;
|
|
1543
|
+
font-weight: 650 !important;
|
|
1544
|
+
line-height: 1 !important;
|
|
1545
|
+
}
|
|
1546
|
+
|
|
1547
|
+
/* Меню аккаунта — над нижней строкой иконок, а не в левом верхнем углу
|
|
1548
|
+
* (родная кнопка аккаунта скрыта, и нативный портал теряет якорь). */
|
|
1549
|
+
[data-dshm-account-menu] {
|
|
1550
|
+
top: auto !important;
|
|
1551
|
+
left: .5rem !important;
|
|
1552
|
+
bottom: calc(env(safe-area-inset-bottom) + 3.75rem) !important;
|
|
1553
|
+
max-height: calc(100dvh - 5rem) !important;
|
|
1554
|
+
overflow-y: auto !important;
|
|
1555
|
+
z-index: 90 !important;
|
|
1556
|
+
}
|
|
1557
|
+
|
|
1558
|
+
/* Анимации нижних меню: мягкий подъём, а не мгновенное появление. */
|
|
1559
|
+
@keyframes dshm-pop-in {
|
|
1560
|
+
from { opacity: 0; transform: translateY(.5rem) scale(.98); }
|
|
1561
|
+
to { opacity: 1; transform: none; }
|
|
1562
|
+
}
|
|
1563
|
+
.dshm-more-menu { animation: dshm-pop-in .18s cubic-bezier(.2,.8,.2,1) both; }
|
|
1564
|
+
.dshm-more-scrim { animation: dshm-fade-in .16s ease both; }
|
|
1565
|
+
[data-dshm-account-menu] { animation: dshm-pop-in .18s cubic-bezier(.2,.8,.2,1) both; }
|
|
1566
|
+
.dshm-pair-overlay { animation: dshm-fade-in .18s ease both; }
|
|
1567
|
+
.dshm-pair-card { animation: dshm-pop-in .22s cubic-bezier(.2,.8,.2,1) both; }
|
|
1568
|
+
@keyframes dshm-fade-in { from { opacity: 0; } to { opacity: 1; } }
|
|
1569
|
+
.dshm-bottom-button:active { transform: scale(.9); background: rgba(255,255,255,.08) !important; }
|
|
1570
|
+
.dshm-more-item { transition: background-color .15s ease; }
|
|
1571
|
+
|
|
1572
|
+
/* Нативное меню аккаунта использует translucent material и на фоне длинного
|
|
1573
|
+
* списка просвечивает; на телефоне делаем его плотной карточкой. */
|
|
1574
|
+
[data-dshm-account-menu] {
|
|
1575
|
+
width: 11rem !important;
|
|
1576
|
+
min-width: 10rem !important;
|
|
1577
|
+
padding: .375rem !important;
|
|
1578
|
+
border: 1px solid #2b2d34 !important;
|
|
1579
|
+
border-radius: .875rem !important;
|
|
1580
|
+
background: #24262b !important;
|
|
1581
|
+
color: #f5f6f8 !important;
|
|
1582
|
+
box-shadow: 0 .75rem 2rem rgba(0, 0, 0, .45) !important;
|
|
1583
|
+
backdrop-filter: none !important;
|
|
1584
|
+
}
|
|
1585
|
+
|
|
1586
|
+
[data-dshm-account-menu] button,
|
|
1587
|
+
[data-dshm-account-menu] [role=menuitem] {
|
|
1588
|
+
min-height: 2.75rem !important;
|
|
1589
|
+
border-radius: .55rem !important;
|
|
1590
|
+
color: #f5f6f8 !important;
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
[data-dshm-account-menu] button:active,
|
|
1594
|
+
[data-dshm-account-menu] [role=menuitem]:active {
|
|
1595
|
+
background: rgba(255, 255, 255, .08) !important;
|
|
1596
|
+
}
|
|
1597
|
+
|
|
1598
|
+
/* На полноэкранной правой панели плавающая кнопка меню перекрывает заголовок
|
|
1599
|
+
* «Файлы/Терминал» и крестик закрытия. Прячем её, пока панель открыта. */
|
|
1600
|
+
html[data-dshm-right-open] .dshm-menu {
|
|
1601
|
+
display: none !important;
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
/* На телефоне отдельный крестик вкладки наезжает на её заголовок: «Файлы»
|
|
1605
|
+
* превращалось в «Файл…». Закрыть всю правую панель можно крестиком справа,
|
|
1606
|
+
* поэтому крестик вкладки скрываем. */
|
|
1607
|
+
[data-sidebar-right-panel] [class*="_tabClose_"] {
|
|
1608
|
+
display: none !important;
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
html[data-dshm-modal] .dshm-bottom-nav,
|
|
1612
|
+
html[data-dshm-modal] .dshm-menu {
|
|
1613
|
+
display: none !important;
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
/* Пока открыт поиск, нижняя строка иконок не нужна: она забирает место у
|
|
1617
|
+
* результатов и оказывается прямо над клавиатурой. */
|
|
1618
|
+
html[data-dshm-search-open] .dshm-bottom-nav {
|
|
1619
|
+
display: none !important;
|
|
1620
|
+
}
|
|
1621
|
+
|
|
1622
|
+
/* Нижняя строка появляется мягко, а не прыжком при открытии панели. */
|
|
1623
|
+
.dshm-bottom-nav {
|
|
1624
|
+
animation: dshm-fade-in .2s ease both;
|
|
1625
|
+
}
|
|
1626
|
+
|
|
1627
|
+
/* Иконки в шапке «Рабочие области» (поиск, параметры, добавить) приведены к
|
|
1628
|
+
* одному пальцевому размеру 44 px; раньше настройки и плюс были 28×28. */
|
|
1629
|
+
:is([class$="_sectionHeader"], [class*="_sectionHeader "]) :is([class$="_iconButton"], [class*="_iconButton "]) {
|
|
1630
|
+
width: 2.75rem !important;
|
|
1631
|
+
height: 2.75rem !important;
|
|
1632
|
+
min-width: 2.75rem !important;
|
|
1633
|
+
min-height: 2.75rem !important;
|
|
1634
|
+
display: inline-flex !important;
|
|
1635
|
+
align-items: center !important;
|
|
1636
|
+
justify-content: center !important;
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
/* Три иконки в шапке рабочих областей при ширине 44 не помещаются в панель —
|
|
1640
|
+
* плюс «Добавить» уезжает за край. Оставляем высоту 44 для пальца, ширину 36. */
|
|
1641
|
+
:is([class$="_sectionHeader"], [class*="_sectionHeader "]) :is([class$="_iconButton"], [class*="_iconButton "]) {
|
|
1642
|
+
width: 2.25rem !important;
|
|
1643
|
+
min-width: 2.25rem !important;
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
/* Правый край шапки «Рабочие области»: плюс «Добавить» не должен упираться
|
|
1647
|
+
* в границу панели и выглядеть обрезанным. */
|
|
1648
|
+
:is([class$="_sectionHeader"], [class*="_sectionHeader "]) {
|
|
1649
|
+
padding-right: .5rem !important;
|
|
1650
|
+
box-sizing: border-box !important;
|
|
1651
|
+
}
|
|
1652
|
+
|
|
1653
|
+
/* Пока открыт поповер настроек/аккаунта, нижняя строка не должна
|
|
1654
|
+
* просвечивать под ним и пересекаться с его нижним краем. */
|
|
1655
|
+
|
|
1656
|
+
/* Нативный поиск по сессиям анимирует высоту через JS/CSS и на телефоне
|
|
1657
|
+
* несколько раз блокирует главный поток. На телефоне открытие/закрытие поля
|
|
1658
|
+
* должно быть мгновенным, без «догоняющей» анимации. */
|
|
1659
|
+
:is([class$="_search"], [class*="_search "]),
|
|
1660
|
+
:is([class$="_searchSlot"], [class*="_searchSlot "]),
|
|
1661
|
+
:is([class$="_sectionHeader"], [class*="_sectionHeader "]) {
|
|
1662
|
+
transition: none !important;
|
|
1663
|
+
animation: none !important;
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
/* На телефоне нативная кнопка «Новая вкладка» была скрыта. Без неё из
|
|
1667
|
+
* правой панели с открытым терминалом нельзя перейти к другому инструменту. */
|
|
1668
|
+
[data-dockkit-add-tab] {
|
|
1669
|
+
display: inline-flex !important;
|
|
1670
|
+
align-items: center !important;
|
|
1671
|
+
justify-content: center !important;
|
|
1672
|
+
width: 2.75rem !important;
|
|
1673
|
+
height: 2.75rem !important;
|
|
1674
|
+
min-width: 2.75rem !important;
|
|
1675
|
+
min-height: 2.75rem !important;
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
/* Кнопка «Новая вкладка» у нативной правой панели живёт в конце
|
|
1679
|
+
* горизонтального таб-стрипа и на телефоне оказывается за экраном.
|
|
1680
|
+
* Поднимаем её в шапку, рядом с закрытием панели. */
|
|
1681
|
+
[data-dockkit-add-tab] {
|
|
1682
|
+
position: fixed !important;
|
|
1683
|
+
top: calc(env(safe-area-inset-top) + 2.75rem) !important;
|
|
1684
|
+
right: 3.75rem !important;
|
|
1685
|
+
z-index: 85 !important;
|
|
1686
|
+
margin: 0 !important;
|
|
1687
|
+
border-radius: .55rem !important;
|
|
1688
|
+
background: transparent !important;
|
|
1689
|
+
color: inherit !important;
|
|
1690
|
+
}
|
|
1691
|
+
|
|
1692
|
+
/* Браузер в правой панели: адресная строка не помещалась рядом с шестью
|
|
1693
|
+
* кнопками и уезжала под «Перейти». Делаем addressBox flex-контейнером:
|
|
1694
|
+
* поле забирает свободную ширину, кнопка «Перейти» стоит после него. */
|
|
1695
|
+
[data-sidebar-right-panel] form[class*="toolbar"] [class*="addressBox"] {
|
|
1696
|
+
display: flex !important;
|
|
1697
|
+
flex: 1 1 auto !important;
|
|
1698
|
+
min-width: 0 !important;
|
|
1699
|
+
align-items: center !important;
|
|
1700
|
+
gap: 0 !important;
|
|
1701
|
+
}
|
|
1702
|
+
|
|
1703
|
+
[data-sidebar-right-panel] form[class*="toolbar"] [class*="addressBox"] input {
|
|
1704
|
+
flex: 1 1 auto !important;
|
|
1705
|
+
width: auto !important;
|
|
1706
|
+
min-width: 0 !important;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
[data-sidebar-right-panel] form[class*="toolbar"] [class*="addressBox"] [class*="addressGo"] {
|
|
1710
|
+
position: static !important;
|
|
1711
|
+
flex: none !important;
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
/* «Новая вкладка» у правой панели: переносим из таб-стрипа в плавающую
|
|
1715
|
+
* кнопку снизу справа, чтобы она не наезжала на заголовки вкладок. */
|
|
1716
|
+
[data-dockkit-add-tab] {
|
|
1717
|
+
top: auto !important;
|
|
1718
|
+
right: .75rem !important;
|
|
1719
|
+
bottom: calc(env(safe-area-inset-bottom) + 4rem) !important;
|
|
1720
|
+
background: #24262b !important;
|
|
1721
|
+
border: 1px solid #2b2d34 !important;
|
|
1722
|
+
border-radius: 50% !important;
|
|
1723
|
+
box-shadow: 0 .5rem 1.25rem rgba(0, 0, 0, .4) !important;
|
|
1724
|
+
}
|
|
1725
|
+
|
|
1726
|
+
/* Вкладки правой панели: крестик закрытия вернуть, но сделать вкладку
|
|
1727
|
+
* достаточно широкой, чтобы заголовок и крестик не накладывались. */
|
|
1728
|
+
[data-sidebar-right-panel] [class*="_tabClose_"] {
|
|
1729
|
+
display: inline-flex !important;
|
|
1730
|
+
align-items: center !important;
|
|
1731
|
+
justify-content: center !important;
|
|
1732
|
+
width: 2.25rem !important;
|
|
1733
|
+
height: 2.75rem !important;
|
|
1734
|
+
min-width: 2.25rem !important;
|
|
1735
|
+
}
|
|
1736
|
+
|
|
1737
|
+
[data-sidebar-right-panel] [class*="_tab_"] {
|
|
1738
|
+
width: 8.75rem !important;
|
|
1739
|
+
min-width: 8.75rem !important;
|
|
1740
|
+
flex: none !important;
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
[data-sidebar-right-panel] [class*="_tabTitle_"] {
|
|
1744
|
+
flex: 1 1 auto !important;
|
|
1745
|
+
width: auto !important;
|
|
1746
|
+
min-width: 0 !important;
|
|
1747
|
+
}
|
|
1748
|
+
|
|
1749
|
+
/* Браузер: вторичные кнопки снимаем с мобильной строки, чтобы адресное поле
|
|
1750
|
+
* получило нормальную ширину. */
|
|
1751
|
+
[data-sidebar-right-panel] button[aria-label="Открыть в системном браузере"],
|
|
1752
|
+
[data-sidebar-right-panel] button[aria-label="Выключить ограничения песочницы"] {
|
|
1753
|
+
display: none !important;
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1756
|
+
/* Адресная строка браузера: плейсхолдер «Введите адрес HTTP(S)» должен
|
|
1757
|
+
* помещаться целиком, без обрезки последних символов. */
|
|
1758
|
+
[data-sidebar-right-panel] form[class*="toolbar"] [class*="addressBox"] input {
|
|
1759
|
+
font-size: .8rem !important;
|
|
1760
|
+
padding-left: .5rem !important;
|
|
1761
|
+
padding-right: .25rem !important;
|
|
1762
|
+
}
|
|
1763
|
+
|
|
1764
|
+
/* Освобождаем ещё место адресной строке: «Обновить» доступно из самого
|
|
1765
|
+
* браузера, а плейсхолдер должен быть читаемым. */
|
|
1766
|
+
[data-sidebar-right-panel] form[class*="toolbar"] button[aria-label="Обновить"] {
|
|
1767
|
+
display: none !important;
|
|
1768
|
+
}
|
|
1769
|
+
|
|
1770
|
+
/* Вкладки настроек DSH не должны обрезать активную подпись о правый край:
|
|
1771
|
+
* чуть плотнее ячейки, чтобы первые три вкладки помещались на экране. */
|
|
1772
|
+
[role=dialog] [class*="_navCell"] {
|
|
1773
|
+
padding-left: .5rem !important;
|
|
1774
|
+
padding-right: .5rem !important;
|
|
1775
|
+
font-size: .82rem !important;
|
|
1776
|
+
}
|
|
1777
|
+
|
|
1778
|
+
/* Вторичные страницы (плагины, автозадачи) прокручиваются под статус-бар и
|
|
1779
|
+
* плавающую кнопку меню. Когда страница сдвинута, верхний край маскируем. */
|
|
1780
|
+
.dshm-page-scrim {
|
|
1781
|
+
position: fixed !important;
|
|
1782
|
+
top: 0 !important;
|
|
1783
|
+
left: 0 !important;
|
|
1784
|
+
right: 0 !important;
|
|
1785
|
+
height: calc(env(safe-area-inset-top) + 3.75rem) !important;
|
|
1786
|
+
z-index: 49 !important;
|
|
1787
|
+
pointer-events: none !important;
|
|
1788
|
+
opacity: 0;
|
|
1789
|
+
transition: opacity .15s ease !important;
|
|
1790
|
+
background: linear-gradient(#0f0f10 55%, rgba(15, 15, 16, 0)) !important;
|
|
1791
|
+
}
|
|
1792
|
+
|
|
1793
|
+
html[data-dshm-page-scrolled] .dshm-page-scrim {
|
|
1794
|
+
opacity: 1;
|
|
1795
|
+
}
|
|
1796
|
+
|
|
1797
|
+
/* Пока меню аккаунта расставляется над нижней строкой, не показываем его
|
|
1798
|
+
* в левом верхнем углу — иначе видно моргание. */
|
|
1799
|
+
html[data-dshm-account-opening] [role=menu] {
|
|
1800
|
+
opacity: 0 !important;
|
|
1801
|
+
pointer-events: none !important;
|
|
1802
|
+
}
|
|
1803
|
+
|
|
1804
|
+
/* Шапка «Рабочие области»: контейнер из двух иконок был шириной 60 px и
|
|
1805
|
+
* обрезал правую половину кнопки «Добавить рабочую область». */
|
|
1806
|
+
:is([class$="_headerActions"], [class*="_headerActions "]) {
|
|
1807
|
+
width: auto !important;
|
|
1808
|
+
min-width: 4.75rem !important;
|
|
1809
|
+
flex: 0 0 auto !important;
|
|
1810
|
+
overflow: visible !important;
|
|
1811
|
+
}
|
|
1812
|
+
|
|
1813
|
+
/* Прозрачный перехватчик: второе касание по кнопке аккаунта закрывает меню,
|
|
1814
|
+
* даже если нативное меню поставило свой слой поверх нижней строки. */
|
|
1815
|
+
.dshm-account-scrim {
|
|
1816
|
+
position: fixed !important;
|
|
1817
|
+
inset: 0 !important;
|
|
1818
|
+
z-index: 85 !important;
|
|
1819
|
+
border: 0 !important;
|
|
1820
|
+
background: transparent !important;
|
|
1821
|
+
-webkit-tap-highlight-color: transparent !important;
|
|
1822
|
+
}
|
|
1823
|
+
|
|
1824
|
+
/* Слот поиска в шапке сжимался до 28 px и наезжал на настройки. Держим его
|
|
1825
|
+
* шириной 44 px, как кнопку; настройки и папка остаются рядом. */
|
|
1826
|
+
:is([class$="_searchSlot"], [class*="_searchSlot "]) {
|
|
1827
|
+
flex: 0 0 2.75rem !important;
|
|
1828
|
+
width: 2.75rem !important;
|
|
1829
|
+
min-width: 2.75rem !important;
|
|
1830
|
+
overflow: visible !important;
|
|
1831
|
+
}
|
|
1832
|
+
|
|
1833
|
+
:is([class$="_searchButton"], [class*="_searchButton "]) {
|
|
1834
|
+
width: 2.75rem !important;
|
|
1835
|
+
min-width: 2.75rem !important;
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
/* Слот поиска должен уметь расти при раскрытии, но не сжиматься меньше 44 px. */
|
|
1839
|
+
:is([class$="_searchSlot"], [class*="_searchSlot "]) {
|
|
1840
|
+
flex: 1 1 auto !important;
|
|
1841
|
+
width: auto !important;
|
|
1842
|
+
min-width: 2.75rem !important;
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
/* Поле поиска в раскрытом слоте не должно сжиматься до 95 px. */
|
|
1846
|
+
:is([class$="_searchInput"], [class*="_searchInput "]) {
|
|
1847
|
+
min-width: 6.5rem !important;
|
|
1848
|
+
}
|
|
1849
|
+
|
|
1850
|
+
/* Минимальная ширина поля нужна только в раскрытом слоте. В закрытом
|
|
1851
|
+
* состоянии поле остаётся 16 px и не держит data-dshm-search-open. */
|
|
1852
|
+
:is([class$="_searchInput"], [class*="_searchInput "]) {
|
|
1853
|
+
min-width: 0 !important;
|
|
1854
|
+
}
|
|
1855
|
+
|
|
1856
|
+
:is([class*="_searchSlotExpanded"]) :is([class$="_searchInput"], [class*="_searchInput "]) {
|
|
1857
|
+
min-width: 6.5rem !important;
|
|
1858
|
+
}
|
|
1859
|
+
|
|
1860
|
+
/* Кнопки «плюс» и панели композера не должны провоцировать клавиатуру. */
|
|
1861
|
+
html[data-dshm-subagent-readonly] :is([class$="_composerStack"], [class*="_composerStack "]) :is([class*="_add"], [class*="_trailing"], [class*="_primary"], [aria-label*="Отправить"], [aria-label*="Начать запись"], [aria-label*="Добавить файлы"], button[aria-label*="выполнить команды"]) {
|
|
1862
|
+
display: none !important;
|
|
1863
|
+
}
|
|
1864
|
+
|
|
1865
|
+
html[data-dshm-subagent-readonly] .dshm-tool,
|
|
1866
|
+
html[data-dshm-subagent-readonly] .dshm-dock-toggle {
|
|
1867
|
+
display: none !important;
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
html[data-dshm-subagent-readonly] [data-dshm-readonly-frame] {
|
|
1871
|
+
display: none !important;
|
|
1872
|
+
}
|
|
1873
|
+
|
|
1874
|
+
.dshm-readonly-banner {
|
|
1875
|
+
display: flex;
|
|
1876
|
+
flex-direction: column;
|
|
1877
|
+
gap: .2rem;
|
|
1878
|
+
margin: .5rem 1rem 1rem;
|
|
1879
|
+
padding: .75rem .9rem;
|
|
1880
|
+
border: 1px solid #343743;
|
|
1881
|
+
border-radius: .875rem;
|
|
1882
|
+
background: #1d1f25;
|
|
1883
|
+
color: #b9becb;
|
|
1884
|
+
font-size: .8125rem;
|
|
1885
|
+
line-height: 1.4;
|
|
1886
|
+
}
|
|
1887
|
+
|
|
1888
|
+
.dshm-readonly-banner strong {
|
|
1889
|
+
color: #f3f5fa;
|
|
1890
|
+
font-size: .875rem;
|
|
1891
|
+
font-weight: 600;
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1894
|
+
/* Адресованный субагент: поле ввода не должно принимать текст и клавиатуру. */
|
|
1895
|
+
html[data-dshm-subagent-readonly] :is([class$="_composerStack"], [class*="_composerStack "]) :is([contenteditable="true"], [contenteditable="false"][data-dshm-readonly-editor]) {
|
|
1896
|
+
pointer-events: none !important;
|
|
1897
|
+
user-select: text !important;
|
|
1898
|
+
opacity: .55 !important;
|
|
1899
|
+
}
|
|
1900
|
+
|
|
1901
|
+
/* В адресованном субагенте оставляем только плашку, без мёртвого композера. */
|
|
1902
|
+
html[data-dshm-subagent-readonly] :is([class$="_composerStack"], [class*="_composerStack "]) {
|
|
1903
|
+
display: none !important;
|
|
1904
|
+
}
|