Нативная ESM-коллекция SVG-флагов городов и населенных пунктов Ленинградской области. Пакет можно использовать как npm-зависимость в JavaScript/TypeScript-проекте или как подключаемый набор готовых SVG-файлов и ленивых загрузчиков.
| Населенный пункт | Флаг | slug |
|---|---|---|
| Выборг | vyborg |
|
| Гатчина | gatchina |
|
| Тихвин | tihvin |
|
| Приозерск | priozersk |
|
| Сосновый Бор | sosnovyy-bor |
- 72 локальных SVG-флага в составе пакета.
- ESM-сборка с TypeScript-типами.
- Ленивые загрузчики для каждого флага.
- Поиск флага по slug, коду, русскому/английскому названию или alias.
- Прямой импорт SVG-файлов через
flags/<slug>илиsvg/<slug>. - Подходит для обычного JavaScript, TypeScript и современных сборщиков.
npm install @russian-flags/leningrad-oblastДля локальной проверки из папки проекта:
npm install .import { loadFlag, settlements } from "@russian-flags/leningrad-oblast";
console.log(settlements[0]);
// {
// slug: "boksitogorsk",
// code: "BOKSITOGORSK",
// nameRu: "Бокситогорск",
// nameEn: "Boksitogorsk",
// aliases: [],
// }
const image = await loadFlag("vyborg", {
alt: "Флаг Выборга",
className: "flag",
});
document.body.append(image);loadFlag - алиас для loadFlagImage. Функция лениво импортирует модуль нужного флага, создает <img> и по умолчанию ставит loading="lazy" и decoding="async".
Если нужен только файл флага, можно импортировать SVG напрямую:
import vyborgFlag from "@russian-flags/leningrad-oblast/flags/vyborg";
import vyborgSvg from "@russian-flags/leningrad-oblast/svg/vyborg";
console.log(vyborgFlag);
console.log(vyborgSvg);Вариант с расширением тоже поддерживается:
import vyborgFlag from "@russian-flags/leningrad-oblast/flags/vyborg.svg";
import vyborgSvg from "@russian-flags/leningrad-oblast/svg/vyborg.svg";flags/<slug> и svg/<slug> указывают на один и тот же файл внутри пакета:
dist/flags/<slug>.svg
После публикации пакет также можно использовать как источник SVG через npm CDN:
<img src="https://unpkg.com/@russian-flags/leningrad-oblast/dist/flags/vyborg.svg" alt="Флаг Выборга"/>В большинство функций можно передавать:
- slug:
"vyborg"; - код:
"VYBORG"; - русское название:
"Выборг"; - английское название:
"Vyborg"; - alias:
"Fyodorovskoye".
import {
resolveSettlementSlug,
settlementSlugs,
settlements,
} from "@russian-flags/leningrad-oblast";
console.log(settlements.length); // 72
console.log(settlementSlugs.includes("vyborg")); // true
console.log(resolveSettlementSlug("VYBORG")); // "vyborg"
console.log(resolveSettlementSlug("Выборг")); // "vyborg"
console.log(resolveSettlementSlug("Vyborg")); // "vyborg"
console.log(resolveSettlementSlug("Fyodorovskoye")); // "fedorovskoe"
console.log(resolveSettlementSlug("yanino_1")); // "yanino-1"
console.log(resolveSettlementSlug("unknown")); // undefinedВвод нормализуется: пробелы по краям удаляются, регистр не важен, ё считается как е, пробелы и _ заменяются на -.
import { loadFlag, settlements } from "@russian-flags/leningrad-oblast";
for (const settlement of settlements) {
const row = document.createElement("tr");
row.dataset.slug = settlement.slug;
row.textContent = settlement.nameRu;
document.querySelector("tbody").append(row);
}
const observer = new IntersectionObserver((entries) => {
for (const entry of entries) {
if (!entry.isIntersecting) continue;
observer.unobserve(entry.target);
loadFlag(entry.target.dataset.slug).then((image) => {
entry.target.append(image);
});
}
});
document
.querySelectorAll("tr[data-slug]")
.forEach((row) => observer.observe(row));preloadFlag запускает загрузку модуля флага без ожидания результата. Это удобно на hover, focus или перед появлением строки во viewport.
import { preloadFlag } from "@russian-flags/leningrad-oblast";
button.addEventListener("pointerenter", () => {
preloadFlag("vyborg");
});Неизвестные значения игнорируются и не выбрасывают ошибку.
| Экспорт | Описание |
|---|---|
settlements |
Массив метаданных { slug, code, nameRu, nameEn, aliases }. |
settlementSlugs |
Массив всех доступных slug. |
normalizeSettlementInput(input) |
Нормализует пользовательский ввод перед поиском. |
resolveSettlementSlug(input) |
Возвращает slug по slug, коду, названию или alias. |
getFlagModuleLoader(input) |
Возвращает ленивый загрузчик модуля флага или undefined. |
loadFlagModule(input) |
Лениво импортирует модуль флага. Бросает ошибку для неизвестного значения. |
loadFlagImage(input, options) |
Загружает флаг и возвращает HTMLImageElement. |
loadFlag(input, options) |
Алиас для loadFlagImage. |
preloadFlag(input) |
Запускает загрузку модуля без ожидания результата. |
createFlagImage(src, defaultAlt, options) |
Создает и настраивает <img> для SVG-флага. |
Пакет поставляет .d.ts файлы и экспортирует основные типы:
import type {
FlagImageOptions,
FlagModule,
SettlementInput,
SettlementMeta,
SettlementSlug,
} from "@russian-flags/leningrad-oblast";FlagImageOptions поддерживает:
| Поле | Назначение |
|---|---|
alt |
Альтернативный текст изображения. |
decoding |
Значение свойства HTMLImageElement.decoding. |
loading |
Значение свойства HTMLImageElement.loading. |
className |
CSS-класс изображения. |
title |
Атрибут title. |
id |
Атрибут id. |
width, height |
Размеры изображения. |
style |
Inline-стили. |
dataset |
Значения для data-*. |
attributes |
Произвольные HTML-атрибуты. |
Пакет рассчитан на современные ESM-проекты и браузерное окружение. Функции loadFlag, loadFlagImage и createFlagImage создают HTMLImageElement, поэтому для них нужен DOM.
Метаданные (settlements, settlementSlugs, resolveSettlementSlug) можно использовать отдельно, например для поиска, автокомплита или генерации списка доступных флагов.
cd examples
npm install
npm run devVite откроет страницу примера в браузере. Пример импортирует опубликованный пакет @russian-flags/leningrad-oblast так же, как это будет делать обычное приложение-потребитель.
npm install
npm run build
npm test
npm run typecheck
npm run pack:dryСборка устроена так:
scripts/build-source.jsчитаетsrc/settlements.ts, проверяетassets/<slug>/index.svgи генерирует TypeScript-исходники.scripts/build.jsсобирает JavaScript черезesbuildи копирует SVG вdist/flags/<slug>.svg.tsc -p tsconfig.build.jsonгенерирует.d.tsфайлы вdist.
Чтобы добавить новый населенный пункт, добавьте запись в src/settlements.ts, положите SVG в assets/<slug>/index.svg и запустите сборку.
- GitHub: https://github.com/russian-flags/leningrad-oblast
- Issues: https://github.com/russian-flags/leningrad-oblast/issues
Код пакета распространяется по лицензии MIT. SVG-флаги не входят в MIT-лицензию кода и сохраняют свои исходные лицензии.