poe-svelte-ui-lib 1.51.0 → 1.53.0
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/README.md +4 -2
- package/dist/locales/i18n.d.ts +1 -1
- package/dist/locales/i18n.js +2 -2
- package/dist/locales/index.d.ts +3 -0
- package/dist/locales/index.js +6 -0
- package/dist/locales/localize.d.ts +1 -1
- package/dist/locales/localize.js +1 -1
- package/dist/locales/translations.d.ts +1 -1
- package/dist/theme.css +28 -11
- package/package.json +5 -1
package/README.md
CHANGED
|
@@ -55,7 +55,9 @@ npm install poe-svelte-ui-lib
|
|
|
55
55
|
/* дальше — только собственные отличия приложения, например :root { min-width: 640px; } */
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
**Поверхности — четыре ступени, заметные в обеих темах:** фон страницы `--bg-body` → панель `--back-color` → блок внутри панели `--container-color` → поле `--field-color` (в тёмной теме поле темнее блока — «утоплено»). Готовые рецепты — классы `ui-panel` (блок прямо на фоне страницы: карточка, шапка раздела, холст, область чата — заливка панели, волосяная рамка, лёгкая тень) и `ui-inset` (блок внутри панели: группа полей, шапка карточки, подложка сообщения). Отступы и скругление задаёт страница классами Tailwind. Панели не делаются полупрозрачными (`bg-(--back-color)/50` сливается с фоном): выпадающие меню и всплывающие блоки — `ui-panel` с тенью `--elevation-3`, свои сообщения в чатах — `--accent-soft`, чужие — `--container-color`.
|
|
59
|
+
|
|
60
|
+
**Предпросмотр темы** — вкладка «Тема» на главной витрины (`src/routes/ThemePreview.svelte`): палитра токенов и состояния, затем все компоненты и виджеты в порядке меню витрины — каждый тип в своём разделе с живыми демо-данными (графики, видео, полёт для PFD и карты), в конце типографика и Markdown; тема переключается кнопкой в шапке витрины. Правьте `theme.css` и смотрите результат там.
|
|
59
61
|
|
|
60
62
|
Текст в Markdown, таблицы и код переносятся по ширине контейнера — горизонтальной прокрутки быть не должно, только вертикальная. Markdown рендерится с `breaks: true` (как в облаке), поэтому абзац и пункт списка пишутся одной строкой — ручной перенос внутри абзаца превращается в разрыв строки.
|
|
61
63
|
|
|
@@ -110,7 +112,7 @@ npm install poe-svelte-ui-lib
|
|
|
110
112
|
|
|
111
113
|
**README компонента** (`src/lib/<Компонент>/README.md`, вкладка «Инфо» витрины) — развёрнутая документация для разработчика. Первые разделы повторяют описание (i) и не должны ему противоречить, дальше идут разработческие: `## Назначение` (плюс заметка о размерах) → `## Пакет данных` (плюс `### Протокол устройства` / пример кода прошивки) → `## Ключи` (таблица «Ключ / Описание», те же формулировки, что в (i)) → `## Особенности` (поведение, ограничения) → `## Пропсы` (таблица «Название / Тип / По умолчанию / Описание», колбэки — `### Колбэки`) → `## Примеры` (Svelte) → `## Конструктор свойств (<Компонент>Props.svelte)` → `## Внутреннее устройство`.
|
|
112
114
|
|
|
113
|
-
**Языки — единственный источник в библиотеке.** Список языков — `LANGUAGES` в `locales/languages.ts`: код, название и флаг (SVG-строка), без Svelte — годится и для серверного кода. **Новый язык — одна запись в `LANGUAGES`**: переключатели языка во всех приложениях (`LOCALES`), колонки окна «Тексты и переводы», многоязычные тексты GUI и словари подхватывают его сами; пока перевода нет — показывается текст языка по умолчанию (`DEFAULT_LANGUAGE`, `ru`). Словари (`Translations`) — строки-объекты по кодам `{ ru: "…", en: "…", zh: "…" }`: обязателен только язык по умолчанию, порядок не важен; недостающие переводы показывает `findMissingTranslations(словарь)`. `locales/i18n.ts` — текущий язык `Language`/`setLanguage` (неизвестный код не применяется, выбор сохраняется в `localStorage` `AppLanguage`), `restoreLanguage()` (сохранённый или язык браузера; стартовое значение всегда язык по умолчанию — серверный рендер совпадает с гидратацией, поэтому SSR-приложения вызывают его в `onMount` корневого layout, SPA — при старте), `LOCALES` (с флагом `flag`) и механизм перевода `createTranslator(словарь)`. Код вне компонентов берёт текущий язык через `getLanguage()` (например, для заголовка `Accept-Language`), ключ хранилища и язык по умолчанию в приложениях не повторяются; серверный код переводит функцией `translate(словарь, язык, ключ)` на язык запроса, разобранный `resolveLanguage(Accept-Language)`. Приложения (DevCloud, WebApp, терминал) свой список языков, хранилище и функцию перевода не держат: берут их из библиотеки и строят свой `$T` из своего словаря — `export const T = createTranslator(translations)`. Одно `setLanguage` переключает и компоненты библиотеки, и приложение. Многоязычные тексты GUI распознаются по виду ключей (коды языков), поэтому данные с языком, убранным из списка, не ломаются.
|
|
115
|
+
**Языки — единственный источник в библиотеке.** Список языков — `LANGUAGES` в `locales/languages.ts`: код, название и флаг (SVG-строка), без Svelte — годится и для серверного кода. **Новый язык — одна запись в `LANGUAGES`**: переключатели языка во всех приложениях (`LOCALES`), колонки окна «Тексты и переводы», многоязычные тексты GUI и словари подхватывают его сами; пока перевода нет — показывается текст языка по умолчанию (`DEFAULT_LANGUAGE`, `ru`). Словари (`Translations`) — строки-объекты по кодам `{ ru: "…", en: "…", zh: "…" }`: обязателен только язык по умолчанию, порядок не важен; недостающие переводы показывает `findMissingTranslations(словарь)`. `locales/i18n.ts` — текущий язык `Language`/`setLanguage` (неизвестный код не применяется, выбор сохраняется в `localStorage` `AppLanguage`), `restoreLanguage()` (сохранённый или язык браузера; стартовое значение всегда язык по умолчанию — серверный рендер совпадает с гидратацией, поэтому SSR-приложения вызывают его в `onMount` корневого layout, SPA — при старте), `LOCALES` (с флагом `flag`) и механизм перевода `createTranslator(словарь)`. Код вне компонентов берёт текущий язык через `getLanguage()` (например, для заголовка `Accept-Language`), ключ хранилища и язык по умолчанию в приложениях не повторяются; серверный код переводит функцией `translate(словарь, язык, ключ)` на язык запроса, разобранный `resolveLanguage(Accept-Language)`. Серверный код, который Node запускает без Vite (например WebSocket-сервер облака через `tsx`), импортирует языки и перевод из `poe-svelte-ui-lib/locales` — корень пакета экспортируется только для Svelte (условие `svelte`) и тянет компоненты, Node его не загрузит. Приложения (DevCloud, WebApp, терминал) свой список языков, хранилище и функцию перевода не держат: берут их из библиотеки и строят свой `$T` из своего словаря — `export const T = createTranslator(translations)`. Одно `setLanguage` переключает и компоненты библиотеки, и приложение. Многоязычные тексты GUI распознаются по виду ключей (коды языков), поэтому данные с языком, убранным из списка, не ломаются.
|
|
114
116
|
|
|
115
117
|
**Языки (ru/en/zh) — два слоя:**
|
|
116
118
|
|
package/dist/locales/i18n.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Readable } from "svelte/store";
|
|
2
|
-
import { type LanguageCode, type Translations } from "./languages";
|
|
2
|
+
import { type LanguageCode, type Translations } from "./languages.js";
|
|
3
3
|
export declare const Language: import("svelte/store").Writable<string>;
|
|
4
4
|
export declare const getLanguage: () => LanguageCode;
|
|
5
5
|
export declare function restoreLanguage(): void;
|
package/dist/locales/i18n.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { derived, get, writable } from "svelte/store";
|
|
2
|
-
import translations from "./translations";
|
|
3
|
-
import { DEFAULT_LANGUAGE, LANGUAGES, isLanguageCode, resolveLanguage } from "./languages";
|
|
2
|
+
import translations from "./translations.js";
|
|
3
|
+
import { DEFAULT_LANGUAGE, LANGUAGES, isLanguageCode, resolveLanguage } from "./languages.js";
|
|
4
4
|
/* Язык и механизм перевода — общие для библиотеки и приложений: приложение берёт отсюда Language/setLanguage/LOCALES и строит свой $T
|
|
5
5
|
из своего словаря через createTranslator (см. README «Языки»); переключение языка одним setLanguage меняет и компоненты, и приложение */
|
|
6
6
|
/*
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/* $lib/locales/index.ts */
|
|
2
|
+
/* Языки и механизм перевода без Svelte-компонентов — точка входа "poe-svelte-ui-lib/locales" для серверного кода, который Node запускает без Vite
|
|
3
|
+
(tsx: WebSocket-сервер облака); импорты с расширением .js, чтобы их разрешал сам Node */
|
|
4
|
+
export * from "./languages.js";
|
|
5
|
+
export * from "./i18n.js";
|
|
6
|
+
export * from "./localize.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type LanguageCode } from "./languages";
|
|
1
|
+
import { type LanguageCode } from "./languages.js";
|
|
2
2
|
export type LocalizedText = string | Partial<Record<LanguageCode, string>>;
|
|
3
3
|
export declare const isLocalizedText: (value: unknown) => value is Partial<Record<LanguageCode, string>>;
|
|
4
4
|
export declare const localizeText: (value: LocalizedText | undefined, lang: string) => string;
|
package/dist/locales/localize.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* $lib/locales/localize.ts */
|
|
2
2
|
/* Многоязычные тексты, введённые в конструкторе: строка (язык по умолчанию) или объект по кодам языков { ru, en, zh, ... };
|
|
3
3
|
язык по умолчанию (DEFAULT_LANGUAGE) — основной и запасной; набор и порядок языков — LANGUAGES (languages.ts) */
|
|
4
|
-
import { DEFAULT_LANGUAGE, LANGUAGE_CODES } from "./languages";
|
|
4
|
+
import { DEFAULT_LANGUAGE, LANGUAGE_CODES } from "./languages.js";
|
|
5
5
|
/* Ключ многоязычного текста: код языка из LANGUAGES или похожий на код (ru, en, pt-BR) — данные с языком, убранным из списка, не ломаются */
|
|
6
6
|
const LANGUAGE_KEY = /^[a-z]{2,3}(-[A-Z]{2})?$/;
|
|
7
7
|
/* Поля свойств, которые считаются текстом для пользователя — их показывает и правит окно «Тексты и переводы» (TextsEditor) */
|
package/dist/theme.css
CHANGED
|
@@ -342,12 +342,12 @@
|
|
|
342
342
|
Градиент на body убран: фон плоский, глубину даёт волосяная линия.
|
|
343
343
|
════════════════════════════════════════════════════════════════════ */
|
|
344
344
|
.light {
|
|
345
|
-
--bg-body: #
|
|
345
|
+
--bg-body: #e9ecf1;
|
|
346
346
|
--back-color: #ffffff;
|
|
347
|
-
--container-color: #
|
|
347
|
+
--container-color: #f2f4f7;
|
|
348
348
|
--field-color: #ffffff;
|
|
349
|
-
--border-color: #
|
|
350
|
-
--hairline-color: rgb(17 24 39 / 0.
|
|
349
|
+
--border-color: #cfd5de;
|
|
350
|
+
--hairline-color: rgb(17 24 39 / 0.11);
|
|
351
351
|
|
|
352
352
|
--font-color: #10141a;
|
|
353
353
|
--muted-color: #545c6b;
|
|
@@ -361,7 +361,7 @@
|
|
|
361
361
|
--shadow-color: #34343a;
|
|
362
362
|
--border-shadow-color: 0 1px 2px rgb(16 24 40 / 0.05);
|
|
363
363
|
--focus-shadow-color: 0 0 0 3px rgb(65 117 200 / 0.18);
|
|
364
|
-
--elevation-1: 0 1px 2px rgb(16 24 40 / 0.
|
|
364
|
+
--elevation-1: 0 1px 2px rgb(16 24 40 / 0.06), 0 2px 6px rgb(16 24 40 / 0.04);
|
|
365
365
|
--elevation-2: 0 4px 12px rgb(16 24 40 / 0.08);
|
|
366
366
|
--elevation-3: 0 12px 32px rgb(16 24 40 / 0.12);
|
|
367
367
|
--scrollbar-color: #c4c9d2;
|
|
@@ -391,11 +391,11 @@
|
|
|
391
391
|
}
|
|
392
392
|
|
|
393
393
|
.dark {
|
|
394
|
-
--bg-body: #
|
|
395
|
-
--back-color: #
|
|
396
|
-
--container-color: #
|
|
397
|
-
--field-color: #
|
|
398
|
-
--border-color: #
|
|
394
|
+
--bg-body: #0b0d12;
|
|
395
|
+
--back-color: #171b23;
|
|
396
|
+
--container-color: #20252f;
|
|
397
|
+
--field-color: #12151b;
|
|
398
|
+
--border-color: #384050;
|
|
399
399
|
--hairline-color: rgb(255 255 255 / 0.1);
|
|
400
400
|
|
|
401
401
|
--font-color: #e9ebf0;
|
|
@@ -417,7 +417,7 @@
|
|
|
417
417
|
|
|
418
418
|
/* Тёмная тема — тёмные, приглушённые тона (S=50%, L — самая тёмная точка, где контраст
|
|
419
419
|
с белым текстом ещё ≥ 4.5:1 и с --bg-body ещё ≥ 3.2:1), а не светлее светлой темы */
|
|
420
|
-
--gray-color: #
|
|
420
|
+
--gray-color: #2b313d;
|
|
421
421
|
--red-color: #a84038;
|
|
422
422
|
--orange-color: #825a2b;
|
|
423
423
|
--yellow-color: #776128;
|
|
@@ -438,6 +438,23 @@
|
|
|
438
438
|
--pink-soft: rgb(168 56 110 / 0.18);
|
|
439
439
|
}
|
|
440
440
|
|
|
441
|
+
/* ─── Поверхности: фон страницы (--bg-body) → панель → вложенный блок → поле ───────────────
|
|
442
|
+
Один рецепт для всех приложений — каждая ступень заметна в обеих темах; панели не делаются полупрозрачными
|
|
443
|
+
(bg-(--back-color)/50 сливается с фоном), отступы и скругление задаёт сама страница классами Tailwind */
|
|
444
|
+
@layer components {
|
|
445
|
+
/* Панель на фоне страницы: карточка, шапка раздела, область холста */
|
|
446
|
+
.ui-panel {
|
|
447
|
+
background-color: var(--back-color);
|
|
448
|
+
border: 1px solid var(--hairline-color);
|
|
449
|
+
box-shadow: var(--elevation-1);
|
|
450
|
+
}
|
|
451
|
+
/* Блок внутри панели: группа полей, строка списка, подложка сообщения */
|
|
452
|
+
.ui-inset {
|
|
453
|
+
background-color: var(--container-color);
|
|
454
|
+
border: 1px solid var(--hairline-color);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
441
458
|
/* ─── Утилиты заливки (без изменений в именах) ───────────────────────── */
|
|
442
459
|
.bg-max {
|
|
443
460
|
--bg-color: var(--back-color);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "poe-svelte-ui-lib",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.53.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/Oleg-Perevyshin/ElementsUI.git"
|
|
@@ -24,6 +24,10 @@
|
|
|
24
24
|
"types": "./dist/index.d.ts",
|
|
25
25
|
"svelte": "./dist/index.js"
|
|
26
26
|
},
|
|
27
|
+
"./locales": {
|
|
28
|
+
"types": "./dist/locales/index.d.ts",
|
|
29
|
+
"default": "./dist/locales/index.js"
|
|
30
|
+
},
|
|
27
31
|
"./theme.css": "./dist/theme.css"
|
|
28
32
|
},
|
|
29
33
|
"files": [
|