itube-specs 0.0.858 → 0.0.859

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.
Files changed (2) hide show
  1. package/README.md +58 -8
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -1,11 +1,14 @@
1
1
  # itube-specs
2
2
 
3
3
  Общий **Nuxt Layer** для сайтов itube. Держит единую базу: компоненты, composables, сервисы, утилиты,
4
- runtime-хелперы, типы, lib-данные, а также middleware, SSR-плагины и BFF-хендлеры (`server/api`).
4
+ runtime-хелперы, типы, lib-данные, middleware, SSR-плагины, BFF-хендлеры (`server/api`) и **весь SCSS —
5
+ палитру, темы, миксины и глобальные стили**.
5
6
  Приложения расширяют слой (`extends: ['itube-specs']`) и форкаются под разные сайты одной ниши —
6
7
  поэтому слой должен оставаться **самодостаточным и site-agnostic**.
7
8
 
8
9
  > Bitbucket: https://bitbucket.org/luckytube/specs/src/master/
10
+ >
11
+ > Заводишь новый сайт поверх слоя — [**NEW_SITE_CHECKLIST.md**](./NEW_SITE_CHECKLIST.md).
9
12
 
10
13
  ---
11
14
 
@@ -81,10 +84,52 @@ lib/ # статические scheme/config-данные (barrel index
81
84
  middleware/ # глобальные: auth.global, normalize.global, age.global
82
85
  plugins/ # SSR/клиент: country/countries/mobile (SSR), services.client, sentry.client, adv
83
86
  server/ # BFF: api/** (тонкие прокси к внешнему API), utils/metrics, plugins/*, tasks
87
+ assets/
88
+ icons/ # спрайты/svg для <UiIcon>
89
+ scss/
90
+ vars/ # _palette (сырые $color-*), _vars (скаляры), _tokens (CSS custom props), _z-index, _index
91
+ themes/ # по папке на тему: light/_theme.scss, dark/_theme.scss — токены по компонентам
92
+ mixins/ # font-sizes, breakpoints, accessibility, page, video-card, surface, button
93
+ base/ # document, global, hacks, animations, loading
94
+ layout/ # layout, page
95
+ main.scss # точка входа: vars/tokens + base + layout
84
96
  ```
85
97
 
86
- > `middleware`/`plugins`/`server` обязаны быть в `files` (whitelist) — иначе не попадут в паблиш
87
- > (см. раздел `files`/`exports`).
98
+ > `middleware`/`plugins`/`server` и каждая подпапка `assets/scss/*` обязаны быть в `files` (whitelist) —
99
+ > иначе не попадут в паблиш (см. раздел `files`/`exports`).
100
+
101
+ ---
102
+
103
+ ## Темы
104
+
105
+ Темы живут здесь, по папке на тему, и раздаются всем сайтам:
106
+
107
+ ```
108
+ assets/scss/themes/light/_theme.scss
109
+ assets/scss/themes/dark/_theme.scss
110
+ ```
111
+
112
+ Приложение только **выбирает** одну — `theme:` в его `config/site.config.ts`. Оттуда значение читают
113
+ и `app.config.ts` (в рантайм), и `nuxt.config.ts`, который добавляет `themes/<theme>/` в Sass
114
+ `loadPaths`. `@forward 'theme'` в `vars/_index.scss` резолвится туда, потому что рядом с ним
115
+ `_theme.scss` нет.
116
+
117
+ **Папка-на-тему обязательна:** Sass требует литеральный путь в `@use`/`@forward`, значит имя файла
118
+ всегда `_theme.scss`, а варьироваться может только папка. Плоские `themes/light.scss` потребовали бы
119
+ `@forward 'themes/light'` — литерал, который нельзя подставить на билде.
120
+
121
+ Приоритет `loadPaths` — приложение первым, поэтому сайт может перекрыть любой партиал по имени:
122
+ свой `assets/scss/vars/_theme.scss` в проекте выиграет у темы слоя (относительный резолв Sass старше
123
+ `loadPaths`). Это точка пер-сайтовой темизации.
124
+
125
+ **Все токены обязаны быть во всех темах.** Отсутствующий токен — жёсткая ошибка Sass в момент, когда
126
+ тема выбрана, то есть падает вся сборка сайта, а не «поехал цвет». Сверять набор имён после любой
127
+ правки темы.
128
+
129
+ Контекстные различия (контрол внутри попапа, вариант кнопки, зависящий от темы) решают миксины
130
+ `surface()` и `button-variant()` из `mixins/`: место объявляет себя, а значения даёт тема через карты
131
+ `$surfaces` / `$button-variant-overrides`. Компоненты про темы не знают. `appConfig.theme` — только
132
+ для структурных различий (`v-if`, другой элемент), никогда для цвета.
88
133
 
89
134
  ---
90
135
 
@@ -117,8 +162,9 @@ ad-конфиг), теперь читается из `runtimeConfig.public` (з
117
162
  `lib/` (scheme, css-breakpoints), middleware (`auth`/`normalize`/`age`), SSR-плагины
118
163
  (`country`/`mobile`/`services`/`sentry`/`adv`), BFF-хендлеры `server/api/**` — всё site-agnostic.
119
164
  - **Приложение:** только per-site — **значения** config (флаги/реклама/локали) через `runtimeConfig.public`
120
- (слой держит пустые контейнеры-заглушки), `assets/scss` (токены), страницы, i18n-локали и остаток
121
- `server/`, завязанный на локали (`locale-guard`, `site/languages`, `is-locale-blocked`).
165
+ (слой держит пустые контейнеры-заглушки), i18n-локали, `public/` и **выбор темы** (`theme:` в
166
+ `config/site.config.ts`). Своего SCSS у приложения нет: `assets/scss/` — пустой слот-оверрайд.
167
+ `server/` целиком в слое, включая locale-кластер.
122
168
 
123
169
  ---
124
170
 
@@ -128,10 +174,14 @@ ad-конфиг), теперь читается из `runtimeConfig.public` (з
128
174
 
129
175
  - **Компоненты** — `pathPrefix: true`: имя = папка + файл (`ui/icon.vue` → `<UiIcon>`), BEM-класс = kebab
130
176
  тега. Корень папки — `index.vue` (или `main.vue`, если иначе имя было бы односложным).
131
- - **`as const`** вместо `enum` — доменные наборы в `runtime/constants/`.
177
+ - **`as const`** вместо `enum` — доменные наборы в `runtime/constants/`, тип через
178
+ `typeof X[keyof typeof X]`. В enum не положить строку из API, он остаётся в бандле, и в
179
+ опубликованном пакете `import type` на нём ломается в рантайме. Фреймворковые union'ы не
180
+ оборачивать. Подробнее — в [CLAUDE.md](./CLAUDE.md).
132
181
  - **Стили** — co-location в `<style lang="scss">` без `scoped`, flat-BEM, только дизайн-токены.
133
- ⚠️ Токены (`vars`/`mixins`) инжектит **приложение** — в слое нет `assets/scss` и `sass`, стили компонентов
134
- компилируются только внутри приложения.
182
+ `vars` и `mixins` **авто-инжектятся** через `additionalData` приложения, поэтому в блоке компонента
183
+ `@use` писать не надо. Сам `sass` в слое не установлен — SCSS компилируется внутри приложения, но
184
+ все исходники (палитра, темы, миксины) лежат здесь.
135
185
  - **Разметка** — семантические теги, `<div>` только когда ничего не подходит.
136
186
  - **TS/JS** — всегда точка с запятой, без лишних комментариев.
137
187
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "itube-specs",
3
3
  "type": "module",
4
- "version": "0.0.858",
4
+ "version": "0.0.859",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {