{"_id":"@ecss/svelte-adapter","name":"@ecss/svelte-adapter","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@ecss/svelte-adapter","version":"0.2.0","description":"ECSS Svelte adapter — generates Svelte 4/5 components from ECSS blocks.","keywords":["adapter","components","ecss","svelte"],"homepage":"https://ecss.webea.ch","bugs":{"url":"https://github.com/webeach/ecss/issues"},"license":"MIT","author":{"name":"Ruslan Martynov","email":"github@webea.ch"},"repository":{"type":"git","url":"git+https://github.com/webeach/ecss.git","directory":"packages/svelte-adapter"},"type":"module","main":"dist/index.cjs","types":"dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./runtime":{"import":{"types":"./dist/runtime/index.d.ts","default":"./dist/runtime/index.js"},"require":{"types":"./dist/runtime/index.d.cts","default":"./dist/runtime/index.cjs"}},"./runtime/svelte4":{"import":{"types":"./dist/runtime/svelte4.d.ts","default":"./dist/runtime/svelte4.js"},"require":{"types":"./dist/runtime/svelte4.d.cts","default":"./dist/runtime/svelte4.cjs"}}},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"dependencies":{"@ecss/compiler":"^0.2.0"},"devDependencies":{"@types/node":"^25.6.0","oxfmt":"^0.52.0","oxlint":"^1.67.0","svelte":"^5.0.0","tsup":"^8","typescript":"^5.9.3","vitest":"^4.1.4"},"peerDependencies":{"svelte":">=4"},"peerDependenciesMeta":{"svelte":{"optional":true}},"engines":{"node":">=18.0.0","pnpm":"^10"},"scripts":{"build":"tsup","dev":"tsup --watch","lint":"oxlint .","lint:fix":"oxlint --fix .","fmt":"oxfmt","fmt:check":"oxfmt --check","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest"},"_id":"@ecss/svelte-adapter@0.2.0","_integrity":"sha512-zG6F+DP4yeF2xwebkE646fTcphrjCF50r4fEz4UTb1RLwk3Vsqh/U/pUEe8ILiO7mz3ohLFtWKD1yN0gAA8HQQ==","_resolved":"/tmp/26c86523b62d1b22744136cd7a947517/ecss-svelte-adapter-0.2.0.tgz","_from":"file:ecss-svelte-adapter-0.2.0.tgz","_nodeVersion":"22.22.3","_npmVersion":"10.9.8","dist":{"integrity":"sha512-zG6F+DP4yeF2xwebkE646fTcphrjCF50r4fEz4UTb1RLwk3Vsqh/U/pUEe8ILiO7mz3ohLFtWKD1yN0gAA8HQQ==","shasum":"d93c05e8871673884421dc4d41421a16a07a95d6","tarball":"https://registry.npmjs.org/@ecss/svelte-adapter/-/svelte-adapter-0.2.0.tgz","fileCount":22,"unpackedSize":156012,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEi2mjLS7MScT0xtteYFR9UCycIrWwIsazBP1cYV5eZ/AiBNhiAI6VrptA9kFSiNHT9ux6pgcC2+5Ekfu4IKujJgig=="}]},"_npmUser":{"name":"ruslan_mart","email":"mkheroes@ya.ru"},"directories":{},"maintainers":[{"name":"ruslan_mart","email":"mkheroes@ya.ru"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/svelte-adapter_0.2.0_1780528298595_0.629054116160789"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-03T23:11:38.387Z","0.2.0":"2026-06-03T23:11:38.783Z","modified":"2026-06-03T23:11:38.980Z"},"maintainers":[{"name":"ruslan_mart","email":"mkheroes@ya.ru"}],"description":"ECSS Svelte adapter — generates Svelte 4/5 components from ECSS blocks.","homepage":"https://ecss.webea.ch","keywords":["adapter","components","ecss","svelte"],"repository":{"type":"git","url":"git+https://github.com/webeach/ecss.git","directory":"packages/svelte-adapter"},"author":{"name":"Ruslan Martynov","email":"github@webea.ch"},"bugs":{"url":"https://github.com/webeach/ecss/issues"},"license":"MIT","readme":"<div align=\"center\">\n  <h1>ECSS Svelte Adapter</h1>\n  <br>\n  <img alt=\"@ecss/svelte-adapter\" src=\"./assets/logo.svg\" height=\"240\">\n  <br>\n  <br>\n  <p style=\"text-decoration: none\">\n    <a href=\"https://www.npmjs.com/package/@ecss/svelte-adapter\">\n       <img src=\"https://img.shields.io/npm/v/@ecss/svelte-adapter.svg?color=c856c6&labelColor=a440a4\" alt=\"npm package\" />\n    </a>\n    <a href=\"https://github.com/webeach/ecss/actions\">\n      <img src=\"https://img.shields.io/github/actions/workflow/status/webeach/ecss/ci.yml?color=c856c6&labelColor=a440a4\" alt=\"build\" />\n    </a>\n    <a href=\"https://www.npmjs.com/package/@ecss/svelte-adapter\">\n      <img src=\"https://img.shields.io/npm/dm/@ecss/svelte-adapter.svg?color=c856c6&labelColor=a440a4\" alt=\"npm downloads\" />\n    </a>\n  </p>\n  <p><a href=\"./README.md\">🇺🇸 English version</a> | <a href=\"./README.ru.md\">🇷🇺 Русская версия</a></p>\n  <p>Svelte-адаптер для ECSS. Генерирует типизированные компоненты Svelte (4 и 5) на основе ECSS блоков/элементов</p>\n  <p>\n    <a href=\"https://ecss.webea.ch/ru/reference/adapters/svelte.html\" style=\"font-size: 1.5em\">📖 Documentation</a>\n  </p>\n</div>\n\n```svelte\n<script lang=\"ts\">\n  import { EButton } from './Button.ecss';\n</script>\n\n<EButton as=\"button\" params={{ variant: 'primary' }} onclick={onClick}>\n  Нажми меня\n</EButton>\n```\n\n---\n\n## 📦 Установка\n\n```bash\nnpm i -D @ecss/svelte-adapter\n```\n\n```bash\npnpm add -D @ecss/svelte-adapter\n```\n\n```bash\nyarn add -D @ecss/svelte-adapter\n```\n\nТребуется установленный `svelte` версии 4 или выше.\n\n---\n\n## 🚀 Подключение\n\nАдаптер регистрируется в `ecss.config.ts` через `defineConfig` из `@ecss/config` — конфиг не привязан к конкретному сборщику, его читает ECSS-плагин вашего бандлера (`@ecss/vite-plugin` и др.). `defaultAdapter` указывает, какой адаптер применяется к `.ecss`-файлам по умолчанию; id Svelte-адаптера — `'svelte'`:\n\n```ts\n// ecss.config.ts\nimport { defineConfig } from '@ecss/config';\nimport { svelteAdapter } from '@ecss/svelte-adapter';\n\nexport default defineConfig({\n  adapters: [svelteAdapter()],\n  defaultAdapter: 'svelte',\n});\n```\n\n---\n\n## 🛠 Использование\n\nКаждый `@block` превращается в компонент Svelte, который импортируется напрямую из `.ecss`-файла:\n\n```svelte\n<script lang=\"ts\">\n  import { EButton } from './Button.ecss';\n</script>\n\n<EButton as=\"button\" params={{ variant: 'primary' }}>\n  Нажми меня\n</EButton>\n```\n\nИмя компонента — это префикс + имя блока: `@block Button` → `EButton`, `@block Card` → `ECard`. Содержимое передаётся через слот по умолчанию (всё, что между тегами).\n\n> В отличие от React/Vue-адаптеров, Svelte-адаптер **module-based**: он генерирует настоящие `.svelte`-файлы в каталоге `.ecss/`, а импорт `./X.ecss` перенаправляется на них автоматически. Для вас это прозрачно — импортируйте компонент как обычно.\n\n### Проп `params`\n\nПараметры блока передаются единственным пропом `params`. TypeScript знает их типы из сгенерированного интерфейса `{Block}Params` (например `ButtonParams`), поэтому передать несуществующее значение enum не получится.\n\n`params` обязателен ровно тогда, когда у блока есть хотя бы один обязательный `@param` (без `?`). Если все параметры опциональны или их нет вовсе — проп можно не передавать.\n\n```svelte\n<!-- у Button есть обязательный @param variant → params обязателен -->\n<EButton params={{ variant: 'primary' }} />\n\n<!-- у Card все параметры опциональны → params можно опустить -->\n<ECard />\n```\n\n### Проп `as`\n\nПо умолчанию компонент рендерится как `<div>`. Проп `as` принимает любой HTML-тег и меняет корневой элемент. В Svelte 5 тип сужается по выбранному тегу (через `generics` + `SvelteHTMLElements`), поэтому доступны соответствующие атрибуты:\n\n```svelte\n<EButton as=\"button\" type=\"submit\" params={{ variant: 'primary' }}>Отправить</EButton>\n\n<EButton as=\"a\" href=\"/about\" params={{ variant: 'ghost' }}>Ссылка</EButton>\n```\n\nПри `as=\"a\"` доступны `href`, `target` и прочие атрибуты `<a>`; при `as=\"button\"` — `type`, `disabled` и т.д.\n\n### `class`, `style` и атрибуты\n\nECSS задаёт корневому элементу класс блока, CSS-переменные из `params` и `data`-атрибуты. То, что передаёт потребитель, объединяется с этими значениями:\n\n- `class` — потребительский класс добавляется к классу блока, не затирая его;\n- `style` — добавляется к CSS-переменным, сгенерированным из `params`;\n- остальные атрибуты и обработчики (`id`, `aria-*`, `onclick`, `href`, …) прокидываются на корневой элемент и выигрывают при коллизии с `data`-атрибутами.\n\n---\n\n## 🧩 Суб-компоненты (`@element`)\n\nЕсли в `@block` объявлены `@element`, они становятся вложенными компонентами через статические свойства корневого компонента и доступны в шаблоне через точечную нотацию:\n\n```svelte\n<EButton params={{ withIcon: true }}>\n  <EButton.Icon>\n    <svg><!-- … --></svg>\n  </EButton.Icon>\n  <EButton.Text>Нажми меня</EButton.Text>\n</EButton>\n```\n\nСуб-компоненты поддерживают тот же проп `as` (по умолчанию `<div>`), но не принимают `params`.\n\n---\n\n## ⚙️ Опции\n\n```ts\nsvelteAdapter({\n  componentNamePrefix: 'E', // по умолчанию 'E'\n});\n```\n\n| Опция                 | Тип      | По умолчанию | Описание                                                                       |\n| --------------------- | -------- | ------------ | ------------------------------------------------------------------------------ |\n| `componentNamePrefix` | `string` | `'E'`        | Префикс имени компонента. Первый символ — `[A-Z]`, остальные — `[a-zA-Z0-9_]`. |\n\n```ts\nsvelteAdapter({ componentNamePrefix: 'My' }); // → MyButton, MyCard\n```\n\nНекорректный префикс (не подходящий под `/^[A-Z][a-zA-Z0-9_]*$/`) приводит к ошибке на этапе сборки.\n\n---\n\n## 🟠 Поддержка версий Svelte\n\nАдаптер определяет мажорную версию Svelte, установленного в проекте, и генерирует соответствующий код:\n\n- **Svelte 5** — компоненты на рунах (`$props`, `$derived`), слот через `{@render children?.()}`; события — обычные атрибуты (`onclick`, `oninput`, …).\n- **Svelte 4** — `export let` + реактивные объявления `$:`, слот через `<slot />`; все события (`on:click`, `on:input`, …) автоматически перенаправляются на корневой элемент.\n\nВерсия читается из `svelte/package.json` относительно корня проекта и кешируется. Если Svelte не удаётся разрешить, адаптер выводит предупреждение и использует Svelte 5 как значение по умолчанию.\n\n---\n\n## 👨‍💻 Автор\n\nРазработка и поддержка: [Руслан Мартынов](https://github.com/ruslan-mart)\n\nЕсли нашёл баг или есть предложение — открывай issue или отправляй pull request.\n\n---\n\n## 📄 Лицензия\n\nРаспространяется под [лицензией MIT](./LICENSE).\n","readmeFilename":"README.ru.md","_rev":"1-8b64123d895b146f782dfc82fa54995c"}