
Библиотека для имитации графических пользовательских интерфейсов операционной системы в Интернете
В частности, Windows 98 - По крайней мере, по крайней мере; Это может быть расширен в будущем.
Эта библиотека поддерживает 98.js.org, веб-версия Windows 98, включая краску, блокнот, звуковой рекордер и многое другое.
Смотрите домашнюю страницу для получения дополнительной информации.
Стоки меню, с поддержкой флажок и радиоэлементов, состояний отключений, подменга
Приложения Windows, которые вы можете перетаскивать, максимизировать, минимизировать, закрывать и изменить размер
Варианты диалога и окна инструмента
Анимация по лету титула, которая направляет ваши глаза во время максимизации/минимизации/восстановления
Соблюдение фокусировки: если вы вкладка или вкладка Shift+в окне, он оборачивается до первого/последнего элемента управления.
Кнопки кнопок, включая легкие кнопки, отключенные кнопки и кнопки действий по умолчанию
Стили прокрутки, специфичные для Webkit (в будущем может появиться пользовательская прокрутка на основе неинтрузивной библиотеки Scrollbar или стилей, поддерживающих библиотеку, где вы ожидаете напрямую использовать библиотеку)
Распространенные с Windows .theme & .themepack файлы во время выполнения !
Смотрите демо онлайн здесь
Эта библиотека в настоящее время требует jQuery для окончательной реализации. Меню не требуют jQuery.
(В конце концов я хочу не иметь никаких зависимостей. Пока я удалил jQuery из кода меню ...)
Библиотека (пока) не предоставлена в виде единого удобного файла.
Вы можете либо 1. Загрузите репозиторий в виде файла ZIP, 2. Клонировать репозиторий, либо 3. Установите библиотеку в виде пакета NPM.
Вы должны включить сценарии для компонентов, которые вы хотите использовать ( MenuBar.js или $Window.js ), а также стиль таблиц для макета, темы и цветовой схемы.
Обязательно используйте скомпилированные файлы CSS, а не исходные файлы.
В <head> :
< link href =" os-gui/layout.css " rel =" stylesheet " type =" text/css " >
< link href =" os-gui/windows-98.css " rel =" stylesheet " type =" text/css " >
< link href =" os-gui/windows-default.css " rel =" stylesheet " type =" text/css " > В <head> или <body> :
< script src =" os-gui/MenuBar.js " > </ script >
< script src =" lib/jquery.js " > </ script > <!-- required by $Window.js -->
< script src =" os-gui/$Window.js " > </ script > Примечание : API, скорее всего, сильно изменится, но я поддерживаю изменение изменений.
.inset-deep создает вставную границу 2PX.outset-deep создает вставную границу 2PX (например, кнопка или окно или всплывающее окно меню).inset-shallow создает вставную границу 1PX.outset-shallow создает границу 1PX Стили кнопок применяются к элементам button во всем мире. (И если вы когда -нибудь захотите его сбросить, обратите внимание, что вы должны избавиться от псевдо -элемента ::after . @Todo: Scope CSS)
Чтобы сделать кнопку переключения, добавьте класс .toggle в кнопку. Сделайте это показывать, как .selected с помощью класса. (@Todo: переименовать это .pressed
Вы должны использовать стили вместе с атрибутами с семантической aria-pressed , aria-haspopup и/или aria-expanded ариями.
Вы можете показать кнопку - это действие по умолчанию, добавив .default в кнопку. Обратите внимание, что в Windows 98 этот стиль перемещается от кнопки на кнопку в зависимости от фокуса. Правило большого пальца заключается в том, что оно должно быть на кнопке, которая будет запускать с помощью Enter.
Вы можете сделать легкую кнопку, .lightweight кнопку. Легкие кнопки тонкие и не имеют границы до пары.
Вы можете отключить кнопку, добавив атрибут «Стандартный disabled к кнопке.
Вы можете показать кнопку, которая нажата, добавив кнопку. .pressing класс в кнопку.
Это полезно для кнопок, которые запускаются клавишным.
Стили Scrollbar применяются во всем мире, но у них есть префикс -webkit- , поэтому они будут работать только в браузерах «на основе веб-сайта», таких как Chrome, Safari и Opera.
(Можно переопределить с ::-webkit-scrollbar и связанные селекторы (но не легко сбросить в браузер по умолчанию, если только -webkit-appearance: scrollbar работает ... @Todo: Scope CSS)
Стили отбора применяются во всем мире.
(Можно ли переопределить с помощью ::selection (но нелегко сбросить в браузер по умолчанию ... если не с unset ? @Todo: Scope CSS)
MenuBar(menus)Создает компонент бара меню.
menus должно быть объектом, удерживающим массивы спецификаций пункта меню, под названием «Имя меню».
Возвращает объект с element свойства, который вы должны добавить в DOM, где вы этого хотите.
Смотрите примеры в демо -коде.
elementЭлемент DOM, который представляет строку меню.
closeMenus()Закрывает любые меню, которые открыты.
setKeyboardScope(...eventTargets)Hotkeys, такие как Alt, будут обрабатываться на уровне заданных элементов (-ов) или целевых (ах) событий.
По умолчанию область применения- window (Global), для случая приложения на одну страницу, где строка меню находится наверху. Если вы помещаете строку меню в окно, вы должны позвонить в это с элементом окна:
menu_bar . setKeyboardScope ( $window . element ) ;или еще лучше,
$window . setMenuBar ( menu_bar ) ;который заботится о сфере клавиатуры для вас, прикрепляя строку меню к окну.
Обратите внимание, что некоторое поведение клавиатуры всегда обрабатывается, если в базе меню сосредоточено.
Примечание также для iframes, вам может потребоваться позвонить в это с помощью $window[0], iframe.contentWindow в настоящее время, но это должно быть изменено в будущем (события клавиатуры должны быть прокси -прокси).
info Можно использовать для реализации строки состояния. Описание предоставляется как event.detail.description при перевороте элементов меню, которые указывают description . Например:
menubar . element . addEventListener ( "info" , ( event ) => {
statusBar . textContent = event . detail ?. description || "" ;
} ) ; default-infoСигнализирует о том, что строка состояния должна быть сброшена в бланк или сообщение по умолчанию.
menubar . element . addEventListener ( "default-info" , ( event ) => {
statusBar . textContent = "" ;
// or:
statusBar . textContent = "For Help, click Help Topics on the Help Menu." ;
// like in MS Paint (and JS Paint)
// or:
statusBar . textContent = "For Help, press F1." ;
// like WordPad
// or perhaps even:
statusBar . innerHTML = "For Help, <a href='docs'>click here</a>" ;
// Note that a link is not a common pattern, and it could only work for the default text;
// for menu item descriptions the message in the status bar is transient, so
// you wouldn't be able to reach it to click on it.
} ) ; Спецификации пункта меню являются либо MENU_DIVIDER (постоянная, указывающая горизонтальное правило), либо спецификацией радио группы, либо объектом со следующими свойствами:
label : этикетка для элемента; Ampersands определяют клавиши доступа (для использования буквального Ampersand, использовать && )shortcutLabel (необязательно): сочетание клавиатуры, чтобы показать элемент, например, «Ctrl+A» (примечание: вам нужно прослушать ярлык самостоятельно, в отличие от клавиш доступа)ariaKeyShortcuts (необязательно): aria-keyshortcuts для элемента, например «Control+A Meta+A», для считывателей экрана. «CTRL» недопустим (вы должны это изложить), и лучше всего предоставить альтернативу для macOS, обычно с эквивалентным командным ключом, используя «Meta» (и event.metaKey ).action (необязательно): функция для выполнения при нажатии на элемент (может указать только action или checkbox )checkbox (необязательный): объект, указывающий, что этот элемент должен вести себя как флажок.check свойств этого объекта должна быть функцией, которая проверяет , следует ли проверять элемент или нет, возвращая true для проверки и false для неконтролируемой. Какое симпатичное имя.toggle свойств должно быть функцией, которая переключает состояние опции, однако вы его храните; вызывается при нажатии.enabled (необязательно): может быть false , чтобы безоговорочно отключить элемент, или функцию, которая определяет, должен ли элемент быть включен, возвращая true , чтобы включить элемент, false , чтобы отключить.submenu (необязательно): массив спецификаций пункта меню для создания подменюdescription (необязательно): для реализации строки состояния; info событие испускается при переворачивании элемента с этим описаниемvalue (необязательно): для радиоэлементов значение элемента; может быть любой тип, но === используется для определения того, проверяется ли элемент.Спецификация радио группы - это объект со следующими свойствами:
radioItems : Массив спецификаций пункта меню для создания радиобатчевой группы. В отличие от submenu , предметы включены непосредственно в это меню. Рекомендуется отделить радио -группу от других пунктов меню с MENU_DIVIDER .getValue : функция, которая должна вернуть значение выбранного элемента радио.setValue : функция, которая должна изменить состояние на заданное значение, специфичным для приложения.ariaLabel (необязательно): строка для использования в качестве aria-label для радиопомощной группы (для доступности для чтения экрана)Меню можно ориентироваться с контекстуальными горячими клавишами, известными как клавиши доступа .
Поместите Ampersand перед буквой в кнопке меню или на метке пункта меню, чтобы сделать его ключом доступа. Microsoft имеет документацию по ключам доступа, включая руководящие принципы для выбора ключей доступа. Как правило, первая буква - хороший выбор.
Если элемент меню не определяет ключ доступа, первая буква метки может использоваться для доступа к нему.
Для кнопок меню вам нужно удерживать Alt при нажатии клавиши доступа кнопки, но для элементов меню во всплывающих окне меню вы должны напрямую нажать клавишу, так как ALT закроет меню.
Если есть несколько элементов меню с одним и тем же ключом доступа, он будет циклироваться между ними, не активируя их. Вы должны попытаться сделать клавиши доступа уникальными, в том числе между определенными клавишами доступа и первыми буквами пунктов меню без определенных клавиш доступа. (Такое поведение наблюдается в Windows 98, в фаворитном меню Explorer, где вы можете сделать закладки с первой буквой, соответствующей ключам доступа других пунктов меню.)
Существует объект AccessKeys , экспортируемый MenuBar.js , с функциями для работы с клавишами доступа:
AccessKeys.escape(label)Выбегает Ampersands в данном этикетке, так что они не интерпретируются как клавиши доступа.
Это полезно для динамических меню, например, меню истории, которое использует титулы страниц в качестве метки. Вы не хотите, чтобы Ampersands были усердно интерпретированы как клавиши доступа, или двойные амперсанды, которые были интерпретированы как единый амперс и.
AccessKeys.unescape(label)Не-эскапты все двойные амперсанды на этикетке.
Для рендеринга используйте вместо этого toHTML или toFragment .
AccessKeys.has(label)Возвращает True, если у метки есть ключ доступа.
AccessKeys.get(label)Возвращает ключ доступа для данной метки или NULL, если нет.
MenuBar обрабатывает клавиши доступа автоматически, но если вы включаете клавиши доступа к другим элементам пользовательского интерфейса, вам нужно обрабатывать с ними самостоятельно, и вы можете использовать это, а не жестко кодировать ключ доступа, поэтому с ним не нужно менять в двух местах.
AccessKeys.remove(label) Удаляет индикатор ключа доступа ( & ) с метки и не собирает любые двойные амперсанды. Также удаляет индикатор ключей доступа в скобках, например, «(& n)», в качестве особого случая.
AccessKeys.toText(label) Удаляет индикатор ключа доступа ( & ) с метки и не собирает любые двойные амперсанды. Это похоже toHTML что для простого текста.
Note : while often access keys are part of a word, like "&New", in translations they are often indicated separately, like "새로 만들기 (&N)", since the access key stays the same, but the letter is no longer part of the word (or even the alphabet). Эта функция не удаляет строки, как «(& n)», она удалит только «&» и оставит «새로 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 만들기 Если вы хотите такое поведение, используйте AccessKeys.remove(label) .
AccessKeys.toHTML(label) Возвращает HTML (с надлежащим выходом) с ключом доступа в качестве элемента <span class='menu-hotkey'> .
Примечание безопасности : безопасно использовать результат этой функции в содержании элемента HTML, поскольку она избегает метки. Это не безопасно использовать в значении атрибута, но это не предполагаемое использование.
ПРИМЕЧАНИЕ <span style="white-space: pre">
AccessKeys.toFragment(label) Возвращает DocumentFragment с ключом доступа в качестве элемента <span class='menu-hotkey'> .
ПРИМЕЧАНИЕ <span style="white-space: pre">
$Window(options)Создает компонент окна, который можно перетащить вокруг и тому подобное, принесено на переднюю часть при нажатии и закрыто. Различные типы окон могут быть созданы с разными параметрами. Обратите внимание, что фокус завершается в контенте окна.
Возвращает объект jQuery с дополнительными методами и свойствами (см. Ниже, после опций).
Узел DOM можно получить с помощью $window.element , а объект $Window можно получить из узла DOM с element.$window .
|
Возвращает объект jQuery с дополнительными методами и свойствами:
title(text) Устанавливает заголовок, или если text не пройден, возвращает текущее заголовок окна.
close(force=false)Закрывает окно.
Если force true , событие «Закрыть» не будет исчезло, и окно будет немедленно закрыто.
focus()Пытается сосредоточить что -то в окне, в этом порядке приоритета:
class="default"$window.$content ) blur()Удаляет фокус из окна. Если фокус находится вне окна, он остается без изменений.
minimize() Минимизирует окно. Если $window.task.$task определено, она будет использовать это в качестве цели для минимизации, в противном случае окно сведет к минимуму до нижней части экрана.
Текущее поведение заключается в том, что оно переключает минимизацию. Это может измениться в будущем.
maximize() Максимизирует окно. В то время как максимизированное, окно будет использовать position: fixed , поэтому оно не будет прокручивать с страницей.
Текущее поведение заключается в том, что он переключает максимизацию. Это может измениться в будущем. Кроме того, если минимизировать, он восстановится вместо максимизации. По сути, он делает то, что делает кнопка Maximize, а не просто то, что предлагает имя метода.
unminimize() Частный: не используйте это. Вместо этого используйте restore() .
Восстанавливает окно из минимизированного состояния.
restore()Восстанавливает окно из минимизированного или максимизированного состояния. Если окно не минимизировано или максимизировано, этот метод ничего не делает.
center()Сосредоточено на окне на странице. Вы должны позвонить в это после того, как содержимое окна полностью отображается, или вы установили фиксированный размер для окна.
Если у вас есть изображения в окне, подождите, пока они загружаются перед отображением и центрированием окна, или определите фиксированный размер для изображений.
applyBounds()Подходит к окну на странице, если оно частично за кадром. (Не изменяйте размер окна, если оно слишком велик; оно уйдет с правой и нижней части экрана.)
bringTitleBarInBounds()Перестранивает окно так, чтобы строка заголовка находилась в пределах границ страницы, чтобы его можно было перетаскивать.
bringToFront() Приносит окно к передней части, установив его z-index больше, чем любой z-index но используется в системе окна.
setDimensions({ innerWidth, innerHeight, outerWidth, outerHeight }) Устанавливает размер окна. Пропустите { innerWidth, innerHeight } , чтобы указать размер в терминах содержимого окна или { outerWidth, outerHeight } чтобы указать размер, включая окно.
(Это может быть расширено в будущем, чтобы также установить позицию ...)
setIcons(icons) Изменяет значок (ы) окна. icons находятся в том же формате, что и options.icons .
setTitlebarIconSize(size)Устанавливает размер значка с заглавным строением окна, выбирая ближайший размер, который доступен.
getTitlebarIconSize()Возвращает размер значка с заглавным строением окна.
getIconAtSize(size) Выбирает ближайший размер значка, который доступен, и возвращает уникальный узел DOM (то есть клонирован) или null если не определены значки.
Это можно использовать для представления окна на панели задач.
setMenuBar(menuBar)Добавляет панель меню в окно и устанавливает сферу клавиатуры для горячих клавишных стержней в окно.
Можно вызвать с null , чтобы удалить строку меню.
setMinimizeTarget(minimizeTargetElement) Минимизация цели (кнопка задач) представляет окно при минимизировании и используется для анимирования минимизации и восстановления. Если minimizeTargetElement является null , окно сведет к минимуму до нижней части экрана (по умолчанию).
$Button(text, action)Создает кнопку в области содержания окна. Он автоматически закрывает окно при нажатии. Нет (хорошего) способа предотвратить это, так как это предназначено только для диалогов.
Если вам нужно какое -либо другое поведение, просто создайте <button> и добавьте его в область содержимого окна.
Возвращает объект jQuery.
addChildWindow($window)Частный: не используйте это.
Определяет окно в детстве. Для окон инструментов состояние фокуса будет передано родительскому окну.
Это используется внутри, когда вы устанавливаете options.parentWindow при создании окна.
onFocus(listener)Вызывает слушателя, когда окно (визуально?) Сфокусировано.
Возвращает функцию, чтобы удалить слушателя.
onBlur(listener)Вызывает слушателя, когда окно (визуально?) Теряет фокус.
Возвращает функцию, чтобы удалить слушателя.
onClosed(listener)Вызывает слушателя, когда окно закрыто (после того, как близкое событие испускается, и если оно не предотвращено).
Возвращает функцию, чтобы удалить слушателя.
onBeforeClose(listener) Вызывает слушателя до того, как окно будет закрыто. Если слушатель вызывает event.preventDefault() , окно не будет закрыто.
Возвращает функцию, чтобы удалить слушателя.
Это событие полезно для подтверждения пользователя перед закрытием окна.
$window.close(true) может затем использоваться для обхода этого события (и подтверждения), когда окно действительно должно быть закрыто.
Если вы не собираетесь предотвратить закрытие окна, вместо этого вам следует использовать closed событие, поскольку, гипотетически, другой слушатель может предотвратить закрытие после слушателя, что приведет к преждевременной очистке.
onBeforeDrag(listener) Вызывает слушателя до того, как окно будет перетаскивано с помощью диапазона титула. Если слушатель вызывает event.preventDefault() , перетаскивание будет предотвращено.
Возвращает функцию, чтобы удалить слушателя.
Это событие позволяет переопределить поведение перетаскивания цветов и инструментов Windows в JS Paint.
onTitleChange(listener)Вызывает слушателя, когда изменение названия окна меняется.
Возвращает функцию, чтобы удалить слушателя.
Это событие можно использовать для обновления метки кнопки панели задач.
onIconChange(listener)Вызывает слушателя, когда меняется значок окна.
Возвращает функцию, чтобы удалить слушателя.
Это событие можно использовать для обновления значка кнопки панели задач. Используйте $window.getIconAtSize(size) , чтобы получить соответствующий значок.
closedБыло ли окно закрыто.
icons Значки окна в разных размерах, как установлено options.icons или setIcons() .
elementsОбъект, содержащий ссылки на элементы окна.
content (HTMLELEMENT)Область содержания окна.
titlebar (Htmlelement)Главная полоса титула окна, включая заголовок, кнопки окон и, возможно, значок.
_title_area (htmlelement)Элемент обертки вокруг заголовка.
Частный: не используйте это. Используйте elements.titlebar или elements.title вместо этого, если это возможно.
title (htmlelement)Название окна.
closeButton (htmlbuttonelement)Кнопка закрытия окна.
minimizeButton (htmlbuttonelement)Кнопка минимизации окна.
maximizeButton (htmlbuttonelement)Кнопка максимизации окна.
$content jQuery объект.
Где вы можете добавить содержимое в окно.
$titlebar jQuery объект.
Заголовок окна, включая заголовок, кнопки окон и, возможно, значок.
$title_area Частный: не используйте это. Вместо этого используйте $title или $titlebar .
jQuery объект.
Обертка вокруг заголовка.
$title jQuery объект.
Заголовок части титульной панели.
$x jQuery объект.
Кнопка закрытия.
$minimize jQuery объект.
Кнопка минимизации.
$maximize jQuery объект.
Максимальная кнопка.
$iconЧастный: не используйте это.
jQuery объект.
Иконка титула.
elementЭлемент DOM, который представляет окно.
close Установите: используйте метод onBeforeClose вместо этого.
Можно использовать для предотвращения закрытия окна с event.preventDefault() . Поскольку может быть несколько слушателей, а другой слушатель может предотвратить закрытие, если вы хотите обнаружить, когда окно фактически закрыто, используйте closed событие.
closed Установилось: вместо этого используйте метод onClosed .
Это событие испускается, когда окно закрыто. Это не может быть предотвращено.
window-drag-start Установилось: вместо этого используйте метод onBeforeDrag .
Может использоваться для предотвращения перетаскивания окна с event.preventDefault() .
title-change Установите: используйте метод onTitleChange вместо этого.
Можно использовать для обновления метки кнопки панели задач.
icon-change Установилось: вместо этого используйте метод onIconChange .
Можно использовать для обновления значка кнопки панели задач. Используйте $window.getIconAtSize(size) , чтобы получить соответствующий значок.
Кроме center() , нет API специально для размещения окон.
Вы можете использовать $($window.element).css({ top: "500px", left: "500px" }) , чтобы установить положение окна с помощью метода jQuery's css() или иначе:
$window . element . style . top = "500px" ;
$window . element . style . left = "500px" ; Вы также можете установить position для fixed или absolute , чтобы расположить окно относительно видоубийта или ближайшего расположенного предка, соответственно.
Если вы хотите установить окно относительно другого окна, вы можете использовать $otherWindow.element.getBoundingClientRect() чтобы получить ограничивающий прямоугольник другого окна, а затем использовать его для размещения окна. Это встроенный DOM API. Например:
const otherRect = $otherWindow . element . getBoundingClientRect ( ) ;
$window . element . top = ` ${ otherRect . top } px` ;
$window . element . left = ` ${ otherRect . right + 10 } px` ; !important ) для размещения окна, потому что библиотека использует встроенные стили для размещения окна, которые имеют приоритет.setDimensions() в будущем, чтобы позволить позиционировать окно в дополнение к его размеру или добавить метод setPosition() .options.constrainRect parse-theme.js содержит функции для анализа и применения тем.
parseThemeFileString(themeString)Подготовки ini -файловой строки в свойства CSS.
Автоматически отображает динамическую графику темы и включает их в свойства CSS.
applyCSSProperties(cssProperties, {element=document.documentElement, recurseIntoIframes=false}) cssProperties - это объект со свойствами и значениями CSS. Это также может быть объект CSSStyleDeclaration .
element - это элемент, чтобы применить свойства.
Если recurseIntoIframes верно, то свойства будут применены и ко всем элементам <iframe> в элементе. Это работает только с одинаковыми iframes.
renderThemeGraphics(cssProperties)Можно использовать для обновления графики темы (значки прокрутки и т. Д.) Для конкретного раздела страницы. Используется демонстрацией, чтобы показать вариации.
Возвращает свойства CSS, представляющие визуализированную графику темы.
element . style . setProperty ( '--scrollbar-size' , '30px' ) ;
applyCSSProperties ( renderThemeGraphics ( getComputedStyle ( element ) ) , { element } ) ; makeThemeCSSFile(cssProperties)Экспортирует файл CSS для темы. Предполагается, что тематическая графика уже отображается. Включает комментарий «сгенерированный файл».
makeBlackToInsetFilter()Инициализирует фильтр SVG, который можно использовать для того, чтобы значки выглядели отключенными. Он может не работать со всеми иконками, поскольку он использует черные части изображения, чтобы сформировать форму.
Использование от CSS:
button : disabled . icon {
filter : saturate ( 0 % ) opacity ( 50 % ); /* fallback until SVG filter is initialized */
filter : url ( "#os-gui-black-to-inset-filter" );
}Лицензировано по лицензии MIT, см. Лицензию для получения подробной информации.
Установите node.js, если у вас его еще нет.
Клонировать репозиторий, затем в каталоге проекта запустите npm i , чтобы установить зависимости. Также запустите npm i при получении изменений из репозитория, в случае, если существуют изменения в зависимостях.
Запустите npm start открывать сервер разработки. Он откроет демо -страницу в вашем браузере по умолчанию. Изменения в библиотеке будут автоматически перекомпилированы, и страница автоматически перезагружается.
Запустите npm run lint чтобы запустить проверку типов и проверку заклинаний (и любые другие задачи по линии).
Запустите npm test , чтобы запустить тесты. Это также сохраняет отчеты о покрытии в каталоге coverage , но обратите внимание, что он записывает только код, охватывающий модульные тесты, т.е. код, импортируемый непосредственно в тесты, а не код, загруженный в контексте страницы, поскольку это требует дальнейшей настройки для инструментов.
Это хорошая идея, чтобы закрыть сервер при обновлении или установке зависимостей; В противном случае вы можете столкнуться с проблемами Eperm.
Стили написаны с помощью PostCSS, для микшинов и других преобразований.
Рекомендуется: установите плагин PostCSS Language для вашего редактора, например, PostCSS Language Support для кода VS.
В настоящее время есть некоторые CSS, которые должны быть вручную регенерированы в браузере и скопированы в файлы CSS, специфичные для темы.
В будущем это можно сделать с помощью пользовательского синтаксиса PostCSS-синтаксиса для файлов .Theme/.temepack, и, возможно, SVG вместо любой растровой графики, чтобы избежать нуждающихся node-canvas (нативные зависимости-это боль). Или, может быть, upng.js и простые манипуляции с пикселями.