F: Improve tooltips for Mac

This commit is contained in:
Ivan 2025-07-08 12:08:06 +03:00
parent cac508451d
commit 022041881b
10 changed files with 42 additions and 19 deletions

View File

@ -8,6 +8,7 @@ import {
IconPin, IconPin,
IconUser2 IconUser2
} from '@/components/icons'; } from '@/components/icons';
import { isMac } from '@/utils/utils';
import { Subtopics } from '../components/subtopics'; import { Subtopics } from '../components/subtopics';
import { HelpTopic } from '../models/help-topic'; import { HelpTopic } from '../models/help-topic';
@ -33,7 +34,7 @@ export function HelpInterface() {
<h2>Навигация и настройки</h2> <h2>Навигация и настройки</h2>
<ul> <ul>
<li> <li>
<kbd>Ctrl + клик</kbd> на объект навигации откроет новую вкладку <kbd>{isMac() ? 'Cmd + клик' : 'Ctrl + клик'}</kbd> на объект навигации откроет новую вкладку
</li> </li>
<li> <li>
<IconPin size='1.25rem' className='inline-icon' /> навигационную панель можно скрыть с помощью кнопки в правом <IconPin size='1.25rem' className='inline-icon' /> навигационную панель можно скрыть с помощью кнопки в правом

View File

@ -15,6 +15,7 @@ import {
IconSubfolders, IconSubfolders,
IconUserSearch IconUserSearch
} from '@/components/icons'; } from '@/components/icons';
import { isMac } from '@/utils/utils';
import { LinkTopic } from '../../components/link-topic'; import { LinkTopic } from '../../components/link-topic';
import { HelpTopic } from '../../models/help-topic'; import { HelpTopic } from '../../models/help-topic';
@ -38,7 +39,7 @@ export function HelpLibrary() {
<kbd>клик</kbd> по строке - переход к редактированию схемы <kbd>клик</kbd> по строке - переход к редактированию схемы
</li> </li>
<li> <li>
<kbd>Ctrl + клик</kbd> по строке откроет схему в новой вкладке <kbd>{isMac() ? 'Cmd + клик' : 'Ctrl + клик'}</kbd> по строке откроет схему в новой вкладке
</li> </li>
<li>Фильтры атрибутов три позиции: да/нет/не применять</li> <li>Фильтры атрибутов три позиции: да/нет/не применять</li>
<li> <li>
@ -74,7 +75,11 @@ export function HelpLibrary() {
<kbd>клик</kbd> по папке отображает справа схемы в ней <kbd>клик</kbd> по папке отображает справа схемы в ней
</li> </li>
<li> <li>
<kbd>Ctrl + клик по папке копирует путь в буфер обмена</kbd> <kbd>
{isMac()
? 'Cmd + клик по папке копирует путь в буфер обмена'
: 'Ctrl + клик по папке копирует путь в буфер обмена'}
</kbd>
</li> </li>
<li> <li>
<kbd>клик</kbd> по иконке сворачивает/разворачивает вложенные <kbd>клик</kbd> по иконке сворачивает/разворачивает вложенные

View File

@ -8,6 +8,7 @@ import {
IconPublic, IconPublic,
IconSave IconSave
} from '@/components/icons'; } from '@/components/icons';
import { isMac } from '@/utils/utils';
import { LinkTopic } from '../../components/link-topic'; import { LinkTopic } from '../../components/link-topic';
import { HelpTopic } from '../../models/help-topic'; import { HelpTopic } from '../../models/help-topic';
@ -34,7 +35,7 @@ export function HelpRSCard() {
<IconOSS className='inline-icon' /> переход к связанной <LinkTopic text='ОСС' topic={HelpTopic.CC_OSS} /> <IconOSS className='inline-icon' /> переход к связанной <LinkTopic text='ОСС' topic={HelpTopic.CC_OSS} />
</li> </li>
<li> <li>
<IconSave className='inline-icon' /> сохранить изменения: <kbd>Ctrl + S</kbd> <IconSave className='inline-icon' /> сохранить изменения: <kbd>{isMac() ? 'Cmd + S' : 'Ctrl + S'}</kbd>
</li> </li>
<li> <li>
<IconEditor className='inline-icon' /> Редактор обладает правом редактирования <IconEditor className='inline-icon' /> Редактор обладает правом редактирования

View File

@ -18,6 +18,7 @@ import {
IconTree, IconTree,
IconTypeGraph IconTypeGraph
} from '@/components/icons'; } from '@/components/icons';
import { isMac } from '@/utils/utils';
import { LinkTopic } from '../../components/link-topic'; import { LinkTopic } from '../../components/link-topic';
import { HelpTopic } from '../../models/help-topic'; import { HelpTopic } from '../../models/help-topic';
@ -40,7 +41,7 @@ export function HelpRSEditor() {
<IconLeftOpen className='inline-icon' /> список конституент <IconLeftOpen className='inline-icon' /> список конституент
</li> </li>
<li> <li>
<IconSave className='inline-icon' /> сохранить: <kbd>Ctrl + S</kbd> <IconSave className='inline-icon' /> сохранить: <kbd>{isMac() ? 'Cmd + S' : 'Ctrl + S'}</kbd>
</li> </li>
<li> <li>
<IconReset className='inline-icon' /> сбросить изменения <IconReset className='inline-icon' /> сбросить изменения
@ -104,7 +105,7 @@ export function HelpRSEditor() {
<LinkTopic text='дерева разбора' topic={HelpTopic.UI_FORMULA_TREE} /> <LinkTopic text='дерева разбора' topic={HelpTopic.UI_FORMULA_TREE} />
</li> </li>
<li> <li>
<kbd>Ctrl + Пробел</kbd> вставка незанятого имени / замена проекции <kbd>{isMac() ? 'Cmd + Пробел' : 'Ctrl + Пробел'}</kbd> вставка незанятого имени / замена проекции
</li> </li>
</ul> </ul>
@ -116,7 +117,7 @@ export function HelpRSEditor() {
<LinkTopic text='Термина' topic={HelpTopic.CC_CONSTITUENTA} /> <LinkTopic text='Термина' topic={HelpTopic.CC_CONSTITUENTA} />
</li> </li>
<li> <li>
<kbd>Ctrl + Пробел</kbd> открывает редактирование отсылок <kbd>{isMac() ? 'Cmd + Пробел' : 'Ctrl + Пробел'}</kbd> открывает редактирование отсылок
</li> </li>
</ul> </ul>
</div> </div>

View File

@ -12,7 +12,7 @@ import { cn } from '@/components/utils';
import { useModificationStore } from '@/stores/modification'; import { useModificationStore } from '@/stores/modification';
import { usePreferencesStore } from '@/stores/preferences'; import { usePreferencesStore } from '@/stores/preferences';
import { tooltipText } from '@/utils/labels'; import { tooltipText } from '@/utils/labels';
import { prepareTooltip, sharePage } from '@/utils/utils'; import { isMac, prepareTooltip, sharePage } from '@/utils/utils';
import { AccessPolicy, type ILibraryItem, LibraryItemType } from '../backend/types'; import { AccessPolicy, type ILibraryItem, LibraryItemType } from '../backend/types';
import { useMutatingLibrary } from '../backend/use-mutating-library'; import { useMutatingLibrary } from '../backend/use-mutating-library';
@ -71,7 +71,7 @@ export function ToolbarItemCard({
{ossSelector} {ossSelector}
{isMutable || isModified ? ( {isMutable || isModified ? (
<MiniButton <MiniButton
titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')} titleHtml={prepareTooltip('Сохранить изменения', isMac() ? 'Cmd + S' : 'Ctrl + S')}
aria-label='Сохранить изменения' aria-label='Сохранить изменения'
icon={<IconSave size='1.25rem' className='icon-primary' />} icon={<IconSave size='1.25rem' className='icon-primary' />}
onClick={onSubmit} onClick={onSubmit}

View File

@ -27,7 +27,7 @@ import { type Styling } from '@/components/props';
import { cn } from '@/components/utils'; import { cn } from '@/components/utils';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { usePreferencesStore } from '@/stores/preferences'; import { usePreferencesStore } from '@/stores/preferences';
import { isIOS, notImplemented, prepareTooltip } from '@/utils/utils'; import { isIOS, isMac, notImplemented, prepareTooltip } from '@/utils/utils';
import { useMutatingOss } from '../../../backend/use-mutating-oss'; import { useMutatingOss } from '../../../backend/use-mutating-oss';
import { useUpdateLayout } from '../../../backend/use-update-layout'; import { useUpdateLayout } from '../../../backend/use-update-layout';
@ -146,7 +146,7 @@ export function ToolbarOssGraph({
<div className='cc-icons items-start'> <div className='cc-icons items-start'>
<MiniButton <MiniButton
aria-label='Сохранить изменения' aria-label='Сохранить изменения'
titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')} titleHtml={prepareTooltip('Сохранить изменения', isMac() ? '⌘ + S' : 'Ctrl + S')}
hideTitle={menu.isOpen} hideTitle={menu.isOpen}
icon={<IconSave size='1.25rem' className='icon-primary' />} icon={<IconSave size='1.25rem' className='icon-primary' />}
onClick={handleSavePositions} onClick={handleSavePositions}

View File

@ -4,6 +4,7 @@ import { hoverTooltip, type TooltipView } from '@codemirror/view';
import clsx from 'clsx'; import clsx from 'clsx';
import { findContainedNodes } from '@/utils/codemirror'; import { findContainedNodes } from '@/utils/codemirror';
import { isMac } from '@/utils/utils';
import { describeConstituentaTerm, labelGrammeme } from '../../labels'; import { describeConstituentaTerm, labelGrammeme } from '../../labels';
import { type IEntityReference, type ISyntacticReference } from '../../models/language'; import { type IEntityReference, type ISyntacticReference } from '../../models/language';
@ -95,7 +96,9 @@ function domTooltipEntityReference(ref: IEntityReference, cst: IConstituenta | n
if (canClick) { if (canClick) {
const clickTip = document.createElement('p'); const clickTip = document.createElement('p');
clickTip.className = 'text-center text-xs mt-1'; clickTip.className = 'text-center text-xs mt-1';
clickTip.innerHTML = '<kbd>Ctrl + клик</kbd> для перехода</br><kbd>Ctrl + пробел</kbd> для редактирования'; clickTip.innerHTML = isMac()
? '<kbd>Cmd + клик</kbd> для перехода</br><kbd>Cmd + пробел</kbd> для редактирования'
: '<kbd>Ctrl + клик</kbd> для перехода</br><kbd>Ctrl + пробел</kbd> для редактирования';
dom.appendChild(clickTip); dom.appendChild(clickTip);
} }
@ -140,7 +143,9 @@ function domTooltipSyntacticReference(
if (canClick) { if (canClick) {
const clickTip = document.createElement('p'); const clickTip = document.createElement('p');
clickTip.className = 'text-center text-xs mt-1'; clickTip.className = 'text-center text-xs mt-1';
clickTip.innerHTML = '<kbd>Ctrl + пробел</kbd> для редактирования'; clickTip.innerHTML = isMac()
? '<kbd>Cmd + пробел</kbd> для редактирования'
: '<kbd>Ctrl + пробел</kbd> для редактирования';
dom.appendChild(clickTip); dom.appendChild(clickTip);
} }

View File

@ -22,7 +22,7 @@ import { cn } from '@/components/utils';
import { useModificationStore } from '@/stores/modification'; import { useModificationStore } from '@/stores/modification';
import { usePreferencesStore } from '@/stores/preferences'; import { usePreferencesStore } from '@/stores/preferences';
import { tooltipText } from '@/utils/labels'; import { tooltipText } from '@/utils/labels';
import { prepareTooltip } from '@/utils/utils'; import { isMac, prepareTooltip } from '@/utils/utils';
import { useMutatingRSForm } from '../../../backend/use-mutating-rsform'; import { useMutatingRSForm } from '../../../backend/use-mutating-rsform';
import { type IConstituenta } from '../../../models/rsform'; import { type IConstituenta } from '../../../models/rsform';
@ -97,7 +97,7 @@ export function ToolbarConstituenta({
{isContentEditable ? ( {isContentEditable ? (
<> <>
<MiniButton <MiniButton
titleHtml={prepareTooltip('Сохранить изменения', 'Ctrl + S')} titleHtml={prepareTooltip('Сохранить изменения', isMac() ? 'Cmd + S' : 'Ctrl + S')}
aria-label='Сохранить изменения' aria-label='Сохранить изменения'
icon={<IconSave size='1.25rem' className='icon-primary' />} icon={<IconSave size='1.25rem' className='icon-primary' />}
onClick={onSubmit} onClick={onSubmit}

View File

@ -10,7 +10,7 @@ import { cn } from '@/components/utils';
import { APP_COLORS } from '@/styling/colors'; import { APP_COLORS } from '@/styling/colors';
import { globalIDs } from '@/utils/constants'; import { globalIDs } from '@/utils/constants';
import { type RO } from '@/utils/meta'; import { type RO } from '@/utils/meta';
import { prepareTooltip } from '@/utils/utils'; import { isMac, prepareTooltip } from '@/utils/utils';
import { type IExpressionParseDTO, ParsingStatus } from '../../../backend/types'; import { type IExpressionParseDTO, ParsingStatus } from '../../../backend/types';
import { colorStatusBar } from '../../../colors'; import { colorStatusBar } from '../../../colors';
@ -55,7 +55,7 @@ export function StatusBar({ className, isModified, processing, activeCst, parseD
)} )}
style={{ backgroundColor: processing ? APP_COLORS.bgDefault : colorStatusBar(status) }} style={{ backgroundColor: processing ? APP_COLORS.bgDefault : colorStatusBar(status) }}
data-tooltip-id={globalIDs.tooltip} data-tooltip-id={globalIDs.tooltip}
data-tooltip-html={prepareTooltip('Проверить определение', 'Ctrl + Q')} data-tooltip-html={prepareTooltip('Проверить определение', isMac() ? 'Cmd + Q' : 'Ctrl + Q')}
onClick={onAnalyze} onClick={onAnalyze}
> >
{processing ? ( {processing ? (

View File

@ -215,12 +215,22 @@ export function prepareTooltip(text: string, hotkey?: string) {
/** /**
* Utility to detect iOS/iPadOS. * Utility to detect iOS/iPadOS.
*/ */
export function isIOS() { export function isIOS(): boolean {
if (typeof navigator === 'undefined') { if (typeof navigator === 'undefined') {
return false; return false;
} }
return ( return (
/iPad|iPhone|iPod/.test(navigator.userAgent) || /iPad|iPhone|iPod/i.test(navigator.userAgent) ||
(navigator.userAgent.includes('Macintosh') && 'ontouchend' in document) (navigator.userAgent.includes('Macintosh') && 'ontouchend' in document)
); );
} }
/**
* Utility to detect Mac device.
*/
export function isMac(): boolean {
if (typeof navigator === 'undefined') {
return false;
}
return /Macintosh|MacIntel|MacPPC|Mac68K|Mac OS/i.test(navigator.userAgent);
}