Codex
|
Codex
Дизайн-система для Викимедиа, включающая в себя рекомендации и набор инструментов (дизайн-токены, компоненты и иконки) для разработки пользовательских интерфейсов.
|
Codex — официальная дизайн-система Wikimedia. Она предоставляет единый набор инструментов, рекомендаций и компонентов, которые помогают разработчикам и дизайнерам создавать согласованные, доступные и локализованные пользовательские интерфейсы для проектов Викимедиа.
Codex позволяет участникам использовать стандартизированные компоненты интерфейса, разработанные с использованием Vue.js и базового CSS, вроде кнопок, меню, диалогов и иконок, которые предназначены для удобства использования, доступности и совместимости. Она обеспечивает единообразный внешний вид и поведение наших продуктов, чтобы они соответствовали визуальному стилю и стандартам функциональности Викимедиа. Она поддерживает как разработчиков, так и дизайнеров в создании удобных и легко поддерживаемых интерфейсов.
Посетите официальный сайт документации, чтобы получить подробную информацию о Codex, включая способы его использования вне MediaWiki.
Codex является рекомендованной дизайн-системой для пользовательского интерфейса, и она была включена в MediaWiki с версии MediaWiki 1.39. Помимо этого она доступна в качестве набора npm-пакетов. Система совместно разрабатывается Wikimedia Foundation, Wikimedia Deutschland и волонтёрами.
Исходный код Codex размещён на Gerrit, а его разработка отслеживается в Phabricator. Вы можете ознакомиться с полным списком изменений и присоединиться к нашей группе в Telegram для вкладчиков, чтобы принять участие.
Базовое использование
Codex предоставляет различные «компоненты», которые авторы тем оформления, расширений и скриптов могут встроить в свои пользовательские интерфейсы: кнопки, флажки, переключатели, диалоговые окна и т. д. Многие из этих компонентов широко настраиваемы.
Расширение MediaWiki CodexExample
Codex/Steering Committee поддерживает MediaWiki-расширение CodexExample, демонстрирующее использование дизайн-токенов, компонентов и иконок из Codex.
Вы можете установить это расширение (что создаст служебную страницу под названием Special:CodexExample с живой демонстрацией) или изучить его исходный код для вдохновения.
Для получения дополнительной информации об установке и использовании, см. README.md проекта.
Использование в JavaScript
Компоненты Codex создаются с помощью JavaScript-фреймворка Vue.js.
Если вы разрабатываете Vue-приложение в MediaWiki, тогда загрузить компоненты Codex легко через Загрузчик ресурсов, используя require().
Вы можете загрузить весь Codex за раз или только необходимые компоненты.
Загрузка всей библиотеки (рекомендуется для пользоватеских скриптов)
"ext.myExtension.foo": {
"dependencies": [ "@wikimedia/codex" ]
"packageFiles": [
"init.js",
"MyComponent.vue"
]
}
<!-- MyComponent.vue -->
<template>
<cdx-button @click="doSomething">Нажмите на меня!</cdx-button>
</template>
<script>
const { CdxButton } = require( '@wikimedia/codex' );
module.exports = exports = {
name: "MyComponent",
components: {
CdxButton
},
methods: {
doSomething() {
//...
}
}
}
</script>
Загрузка части компонентов Codex (рекомендуется для тем и расширений)
Укажите зависимости так, чтобы загрузить ограниченный набор компонентов; см. раздел о расширенных возможностях.
Использование без JavaScript (CSS-компоненты Codex)
| Версия MediaWiki: | ≥ 1.42 |
Многие компоненты Codex также поддерживают использование только CSS. Эти копмоненты выглядят идентично своим собратьям на JS, но предлагают более ограниченное поведение.
Загрузка стилей компонентов
Вы можете загрузить стили ограниченного набора CSS-компонентов Codex так же, как это описано выше для JS-компонентов.
Если вам нужны только стили, при определении модуля можно добавить параметр "codexStyleOnly": "true".
"ext.myExtension.foo": {
"class": "MediaWiki\\ResourceLoader\\CodexModule",
"styles": "ext.myExtension.foo/styles.less",
"codexStyleOnly": "true",
"codexComponents": [
"CdxButton",
"CdxCard",
"CdxCheckbox",
"CdxProgressBar"
]
}
Предоставление разметки компонентов
Чтобы использовать CSS-компоненты Codex, убедитесь, что соответствующие стили загружены, а затем добавьте необходимую разметку на страницу. На данном этапе вам придётся делать это вручную. Примеры разметки можно найти в разделе «CSS-only usage» документации компонентов (вот пример разметки для компонента Button).
<div>
<button class="cdx-button cdx-button--action-default">
Кнопка по умолчанию
</button>
</div>
<div>
<button class="cdx-button cdx-button--action-progressive">
Прогрессивная кнопка
</button>
</div>
<div>
<button class="cdx-button cdx-button--action-destructive">
Деструктивная кнопка
</button>
</div>
Использование Codex в PHP
Codex PHP — это библиотека для создания компонентов пользовательского интерфейса, использующих исключительно CSS, на основе Codex, системы дизайна Wikimedia. Ознакомьтесь с документацией по Codex для PHP.
Установка
Установите библиотеку Codex PHP с помощью Composer:
composer require wikimedia/codex
Пример использования
Вот пример создания компонента Accordion на PHP:
$accordion = $codex
->accordion()
->setTitle( "Пример аккордеона" )
->setDescription( "Это пример аккордеона" )
->setContentHtml(
$codex
->htmlSnippet()
->setContent( "<p>Это содержимое аккордеона</p>" )
->build()
)
->setOpen( false )
->setAttributes( [
"class" => "foo",
"bar" => "baz",
] )
->build()
->getHtml();
echo $accordion;
Расширенные возможности
Использование ограниченного набора компонентов
Модуль ResourceLoader @wikimedia/codex предоставляет доступ ко всей библиотеке Codex — ко всем компонентам, стилям и т.д.
Если вы разрабатываете тему или расширение и беспокоетесь о производительности, вам стоит рассмотреть возможность использования функции разделения кода в Codex.
ResourceLoader позволяет указать список компонентов Codex и загружать только JS/CSS для этих компонентов плюс их зависимости.
Регистрировать много модулей крайне не рекомендуется, даже если они не загружаются по умолчанию. Добавление каждого модуля прибавляет 44 bytes[1] к каждой первоначальной загрузке страницы, а с этим около 40 GiB дополнительной передачи на серверы Викимедиа в день.
Чтобы использовать эту функцию, определите пользовательский модуль ResourceLoader (обычно это делается в skin.json или extension.json) и укажите список codexComponents:
"ext.myExtension.blockform": {
"class": "MediaWiki\\ResourceLoader\\CodexModule",
"codexComponents": [
"CdxButton",
"CdxCard",
"CdxDialog",
"CdxIcon",
"CdxRadio",
"CdxTextInput",
"useModelWrapper"
],
"packageFiles": [
"init.js",
"BlockForm.vue"
],
"messages": [
"block-target",
"ipb-submit"
]
}
Это сгенерирует виртуальный файл codex.js в вашем каталоге resources с нужным вам экспортом.
Затем вы можете запросить указанные вами компоненты и composable функции из этого виртуального файла:
// В resources/ext.myExtension/BlockForm.vue
const { CdxButton, CdxTextInput } = require( '../codex.js' );
Если вам нужны только CSS-компоненты и не нужно загружать JavaScript, вы можете добавить "codexStyleOnly": true к определению модуля.
Точно так же, если вам нужны только файлы JavaScript, а не стили, вы можете добавить "codexScriptOnly": "true".
Вы стоит делать это только в том случае, если вы помещаете стили в другой модуль, содержащий только их, как описано выше.
См. репозиторий CodexExample для более детального примера использования Codex в расширении MediaWiki.
Использование иконок Codex
Из соображений производительности модуля ResourceLoader под названием , содержащего бы все значки из Codex, не существует.
Такой модуль был бы громоздким и неэффективным, поскольку большинство пользователей Codex нуждаются лишь в нескольких из более чем 200 иконок.
Вместо этого ResourceLoader предоставляет модулям способ встраивать только те иконки, которые им необходимы, аналогично описанному выше подходу с разделением кода.
codex-icons
{
"name": "icons.json",
"callback": "MediaWiki\\ResourceLoader\\CodexModule::getIcons",
"callbackParam": [
// Укажите иконки, которые необходимы вашему модулю, например:
"cdxIconArrowNext",
"cdxIconBold",
"cdxIconTrash"
]
}
См. также:
Использование дизайн-токенов напрямую
Дизайн-токены могут быть импортированны в таблицы стилей Less как переменные. Это может быть полезно, если вы создаёте свои компоненты или стили, и хотите чтобы они интегрировались с Codex.
Дизайн-токены Codex нужно импортировать из файла mediawiki.skin.variables.less.
@import 'mediawiki.skin.variables.less';
.my-feature {
background-color: @background-color-base;
color: @color-base;
}
См. полный список дизайн-токенов Codex, разбитый по категориям.
Less-миксины Codex
Некоторые функции Codex реализуются с использованием миксинов Less. Например, компонент Link вляется больше Less-миксином, чем компонентом Vue, и использование иконок в компонентах только на CSS требует использования Less-миксина (см. также документацию по использованию компонентов только на CSS).
Использование миксинов Less c Codex в Mediawiki и расширениях работает очень схоже с использованием дизайн-токенов: просто импортируйте mediawiki.skin.variables.less, что сделает доступными все миксины Codex, а заодно и дизайн-токены.
@import 'mediawiki.skin.variables.less';
.my-feature {
a {
.cdx-mixin-link-base();
}
}
Использование Codex в пользовательских скриптах
Codex можно использовать в пользовательских скриптах. Однако существуют некоторые ограничения, требующие определённых обходных решений. Вот несколько моментов, которые стоит учитывать при использовании Vue и Codex в пользовательских скриптах:
- Однофайловые компоненты
.vueне поддерживаются; вам нужно определять компоненты в базовых файлах.js - Всё должно находится в одном файле; пользовательские скрипты не предоставляют оптимального способа загрузки кастомных модулей
- Определите шаблоны компонентов, используя шаблонные литералы ES6
- Предпочитайте глобальную регистрирацию для компонентов Codex
Загрузка Vue/Codex
Вам нужно будет загрузить Vue и Codex через ResourceLoader.
Лучший способ сделать это — использовать mw.loader.using; остальной код вашего пользовательского скрипта должен быть размещён в callback-функции или цепочке промисов.
mw.loader.using( '@wikimedia/codex' ).then( function( require ) {
const Vue = require( 'vue' );
const Codex = require( '@wikimedia/codex' );
} );
Используйте Vue.createMwApp
Как только Vue и Codex будут загружены, вам нужно создать приложение Vue и смонтировать его куда-либо на странице.
Его точное местоположение будет зависеть от того, что вы собираетесь делать.
Для этого можно использовать специальный для MediaWiki метод createMwApp.
mw.loader.using( '@wikimedia/codex' ).then( function( require ) {
//... загрузите Vue и Codex, как указано выше
// создайте элемент, к которому будет смонтировано приложение Vue
const mountPoint = document.body.appendChild( document.createElement( 'div' ) );
// создайте Vue-приложение и смонтируйте его к целевому элементу
Vue.createMwApp( {
// данные, вычисляемые свойства, методы и прочее указываются здесь
} ).mount( mountPoint );
} );
Реальные примеры
Ссылка ниже показывает полный пример пользовательского скрипта, добавляющего ссылку в портлет ко всем страницам вики, которая при клике вызывает кастомный компонент Dialog из Codex. Не стесняйтесь скопировать этот скрипт на свою страницу участника и использовать его как отправную точку.
https://en.wikipedia.org/wiki/User:EGardner_(WMF)/codex-hello-world.js
А вот другой скрипт, использующий Codex:
https://en.wikipedia.org/wiki/User:JSherman_(WMF)/revertrisk.js
Цикл релизов
Новые версии Codex выпускаются по мере необходимости, а не по определённому графику. Когда создаётся новый релиз, в основное ядро MediaWiki также отправляется патч для использования этой новой версии. Поскольку это происходит по вторникам, обновление ядра будет развернуто на следующей неделе (в следующий раз, когда будет запущен deployment train).
Использование кастомной версии Codex для разработки или тестирования
MediaWiki использует последнюю версию Codex. Если вам нужно использовать другую версию для разработки или тестирования, например, чтобы опробовать, как патч, над которым ещё ведётся работа, в Codex взаимодействует с MediaWiki, вы можете указать движку на вашу собственную версию Codex следующим образом:
- Клонируйте репозиторий Codex (если ещё не сделали этого) и выберите изменения, которые хотите протестировать.
- Запустите команду
npm installиnpm run build-allв корневой директории репозитория Codex. - Укажите
$wgCodexDevelopmentDirна корневую директорию репозитория Codex. Например, если вы клонировали репозиторий Codex в родительскую директорию MediaWiki, добавьте$wgCodexDevelopmentDir = MW_INSTALL_PATH . '../codex';в файлLocalSettings.php. - Проверьте, что всё работает, выполнив команду
mw.loader.load( '@wikimedia/codex' )в консоли браузера. Должно появиться предупреждение «You are using a local development version of Codex», и не должно возникать ошибок.
Как только вы завершите настройку, вы сможете вносить дополнительные изменения в ваш клон Codex, но каждый раз необходимо будет запускать команду npm run build-all, чтобы изменения вступили в силу в MediaWiki.
Чтобы отключить режим разработки и вернуться к использованию последней версии Codex, закомментируйте строку в файле LocalSettings.php, которая устанавливает $wgCodexDevelopmentDir.
