SHA256
UI v4: новый стиль по макету V3/V4 и доводка экранов
Палитра «Сияние» по умолчанию, новые роли цветов. Лента канала: плоские записи, ряд действий с равным шагом иконок, дата у записи. Обсуждение со строкой ввода, личный чат, шторки. Вход и регистрация: стартовый экран (надпись «СИЯНИЕ», сияние мандалы), настройки входа со статусами серверов, статус логина в одну строку, вход с другого устройства (код, таймер, шаги), сохранение ключей с переключателями. Корневые разделы – заголовок по центру; фильтр чатов – переключатель; уведомления – список как в чатах; фото – просмотр на весь экран. Общее: один зазор под шапкой (--page-top-gap), переключатели высотой с поле ввода, второстепенные кнопки по одной роли (в том числе на экранах устройств и серверов), иконки только из ui-icon.js, полоса прокрутки скрыта, среднее тире в текстах интерфейса. Что нужно от сервера и разработчика – docs/UI-Design/UI-v4-for-dev.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,15 +16,38 @@ export const PALETTE_ROLES = [
|
||||
{ id: 'text-secondary', label: 'Вторичный текст: время, подсказки' },
|
||||
{ id: 'border-subtle', label: 'Разделители' },
|
||||
{ id: 'border-control', label: 'Рамки полей и кнопок' },
|
||||
{ id: 'surface-raised', label: 'Приподнятое: поля ввода, наведение' },
|
||||
{ id: 'accent', label: 'Акцент: главные кнопки, ссылки' },
|
||||
{ id: 'action', label: 'Вторичное действие: «Ответить», ссылки' },
|
||||
{ id: 'bubble-out', label: 'Исходящее сообщение' },
|
||||
{ id: 'on-accent', label: 'Текст на акцентной кнопке' },
|
||||
{ id: 'reaction-active', label: 'Поставленный лайк' },
|
||||
{ id: 'danger', label: 'Ошибки и удаление' },
|
||||
{ id: 'success', label: 'Успех' },
|
||||
{ id: 'warning', label: 'Предупреждение' },
|
||||
{ id: 'info', label: 'Информация, подсказки о процессе' },
|
||||
];
|
||||
|
||||
export const PALETTE_PRESETS = {
|
||||
// «Сияние» – цветовые роли макета V3/V4: тёмная тема из спецификации,
|
||||
// светлая подобрана отдельно, а не инверсией.
|
||||
aurora: {
|
||||
label: 'Сияние',
|
||||
dark: {
|
||||
background: '#121419', surface: '#1c1f27', 'surface-selected': '#302b43', 'surface-raised': '#272a34',
|
||||
'text-primary': '#f1f1f5', 'text-secondary': '#a8abb8',
|
||||
'border-subtle': '#303440', 'border-control': '#454858',
|
||||
accent: '#b8aef5', 'on-accent': '#211c34', action: '#c6bff5', 'bubble-out': '#39324d',
|
||||
'reaction-active': '#b8aef5', danger: '#f2a1ad', success: '#91d4b0', warning: '#edc487', info: '#a8c9f3',
|
||||
},
|
||||
light: {
|
||||
background: '#f3f2f7', surface: '#ffffff', 'surface-selected': '#e8e3fa', 'surface-raised': '#ecebf2',
|
||||
'text-primary': '#1d1b26', 'text-secondary': '#5f5b6e',
|
||||
'border-subtle': '#e0dde8', 'border-control': '#a19db2',
|
||||
accent: '#5d4fc4', 'on-accent': '#ffffff', action: '#5244b5', 'bubble-out': '#e6e0fb',
|
||||
'reaction-active': '#5d4fc4', danger: '#b3304a', success: '#2d7552', warning: '#8a5a0e', info: '#2f5f9e',
|
||||
},
|
||||
},
|
||||
club: {
|
||||
label: 'Индиго',
|
||||
dark: {
|
||||
@@ -138,7 +161,7 @@ for (const [id, label, ...colors] of EXTRA_PRESETS) {
|
||||
PALETTE_PRESETS[id] = makePreset(label, colors.slice(0, 7), colors.slice(7));
|
||||
}
|
||||
|
||||
const DEFAULT_PRESET = 'club';
|
||||
const DEFAULT_PRESET = 'aurora';
|
||||
const HEX_COLOR = /^#[0-9a-f]{6}$/i;
|
||||
|
||||
function normalizeMode(value) {
|
||||
@@ -184,9 +207,20 @@ export function getPaletteSettings() {
|
||||
};
|
||||
}
|
||||
|
||||
// Роли, которых нет в старых пресетах, выводятся из основных цветов.
|
||||
function withDerivedRoles(colors, theme) {
|
||||
return {
|
||||
'surface-raised': mixHex(colors.surface, colors['text-primary'], 0.07),
|
||||
action: mixHex(colors.accent, colors['text-primary'], 0.18),
|
||||
'bubble-out': mixHex(colors.surface, colors.accent, theme === 'light' ? 0.16 : 0.22),
|
||||
info: theme === 'light' ? '#2f5f9e' : '#a8c9f3',
|
||||
...colors,
|
||||
};
|
||||
}
|
||||
|
||||
export function resolvePalette(resolvedTheme, settings = getPaletteSettings()) {
|
||||
const theme = resolvedTheme === 'light' ? 'light' : 'dark';
|
||||
return { ...PALETTE_PRESETS[settings.preset][theme], ...settings.custom[theme] };
|
||||
return withDerivedRoles({ ...PALETTE_PRESETS[settings.preset][theme], ...settings.custom[theme] }, theme);
|
||||
}
|
||||
|
||||
function isDefaultPalette(settings) {
|
||||
|
||||
Reference in New Issue
Block a user