diff --git a/Ремонт квартира/.site/assets/style.css b/Ремонт квартира/.site/assets/style.css
index 487eb29..4409707 100644
--- a/Ремонт квартира/.site/assets/style.css
+++ b/Ремонт квартира/.site/assets/style.css
@@ -280,6 +280,7 @@ a.rooms-link:hover .room-name { color: var(--sage-deep); }
.opt__body { padding: 18px 20px 20px; display: flex; flex-direction: column; gap: 4px; flex: 1; }
.opt__no { font-size: 12px; letter-spacing: .12em; color: var(--sage-deep); font-weight: 600; }
.opt__name { font-family: var(--ff-display); font-size: 20px; line-height: 1.15; }
+.opt__desc { font-size: 13.5px; line-height: 1.5; color: var(--ink-soft); margin-top: 2px; }
.opt__price { font-family: var(--ff-display); font-size: 28px; margin-top: 8px; }
.opt__price span { font-size: 15px; color: var(--ink-soft); }
.opt__link {
@@ -288,6 +289,15 @@ a.rooms-link:hover .room-name { color: var(--sage-deep); }
}
.opt__link svg { width: 15px; height: 15px; transition: transform .2s; }
.opt__link:hover svg { transform: translate(2px,-2px); }
+/* группа карточек по типу (техника) */
+.opt-group { margin-top: 34px; }
+.opt-group:first-child { margin-top: 0; }
+.opt-group__title {
+ display: flex; align-items: baseline; gap: 12px; margin: 0 0 16px;
+ font-family: var(--ff-display); font-size: 21px; letter-spacing: -.01em;
+}
+.opt-group__title span { font-size: 12px; letter-spacing: .06em; color: var(--ink-soft); font-weight: 400; }
+.opt-group__title::after { content: ""; flex: 1; height: 1px; background: var(--line); align-self: center; }
@media (max-width: 860px) { .options { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .options { grid-template-columns: 1fr; } }
diff --git a/Ремонт квартира/.site/generate.js b/Ремонт квартира/.site/generate.js
index 685c572..689103e 100644
--- a/Ремонт квартира/.site/generate.js
+++ b/Ремонт квартира/.site/generate.js
@@ -42,6 +42,7 @@ function inline(t) {
t = esc(t);
t = t.replace(/\*\*([^*]+)\*\*/g, '$1');
t = t.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1');
+ t = t.replace(/<br\s*\/?>/gi, '
'); // разрешаем перенос строки
в тексте заметки
return t;
}
@@ -179,28 +180,54 @@ function renderCards(tbl) {
const iPrice = colIndex(H, /цена|price|₽|руб/i);
const iLink = colIndex(H, /ссылк|link|url/i);
const iPhoto = colIndex(H, /фото|photo|картин|image/i);
- const iName = H.findIndex((h, idx) => idx !== iNo && idx !== iPrice && idx !== iLink && idx !== iPhoto && h);
+ const iCat = colIndex(H, /^(тип|категор|группа|техника|раздел)$/i);
+ const iName = H.findIndex((h, idx) => idx !== iNo && idx !== iPrice && idx !== iLink && idx !== iPhoto && idx !== iCat && h);
- const cards = tbl.rows.map((r, idx) => {
- const no = iNo >= 0 && r[iNo] ? r[iNo] : String(idx + 1);
- const name = iName >= 0 ? r[iName] : '';
+ // одна карточка. no — подпись «Вариант N» (в пределах группы)
+ const card = (r, no) => {
+ const nameRaw = iName >= 0 ? (r[iName] || '') : '';
+ // «Модель
описание» → жирная модель + приглушённое описание
+ const [head, ...rest] = nameRaw.split(/
/i);
+ const desc = rest.join('
').trim();
const priceRaw = iPrice >= 0 ? r[iPrice] : '';
const priceNum = (priceRaw.match(/[\d\s .]+/) || [''])[0].trim();
const unit = /₽|руб/i.test(priceRaw) ? '₽' : '';
const photo = iPhoto >= 0 ? parseWiki(r[iPhoto]) : null;
const url = iLink >= 0 ? extractUrl(r[iLink]) : '';
const media = photo
- ? `
` : '';
+ ? `` : '';
const price = priceNum
? `${esc(priceNum)}${unit ? ` ${unit}` : ''}` : '';
const link = url
? `Открыть на ${esc(domainLabel(url))} ` : '';
return `${media}
Вариант ${esc(no)}
- ${inline(name)}
+ ${inline(head)}
+ ${desc ? `${inline(desc)}` : ''}
${price}${link}
`;
+ };
+
+ // без колонки типа — простая сетка карточек
+ if (iCat < 0) {
+ const cards = tbl.rows.map((r, idx) => card(r, iNo >= 0 && r[iNo] ? r[iNo] : idx + 1)).join('\n');
+ return `${cards}
`;
+ }
+
+ // с колонкой типа — группируем по типу (пустая ячейка наследует тип сверху)
+ const groups = [];
+ let cur = null, lastCat = '';
+ tbl.rows.forEach((r) => {
+ const cat = (r[iCat] && r[iCat].trim()) || lastCat;
+ lastCat = cat;
+ if (!cur || cur.cat !== cat) { cur = { cat, rows: [] }; groups.push(cur); }
+ cur.rows.push(r);
+ });
+ return groups.map((g) => {
+ const cards = g.rows.map((r, i) => card(r, i + 1)).join('\n');
+ return `
+
${inline(g.cat)}${g.rows.length} ${plural(g.rows.length, 'вариант', 'варианта', 'вариантов')}
+
${cards}
`;
}).join('\n');
- return `${cards}
`;
}
function tableCell(c) {
diff --git a/Ремонт квартира/README.md b/Ремонт квартира/README.md
index 1a68d53..a64f64d 100644
--- a/Ремонт квартира/README.md
+++ b/Ремонт квартира/README.md
@@ -26,6 +26,12 @@
- Подряд идущие картинки `![[файл.png]]` → **галерея рендеров** (1 крупно / 2 / 3 / 4 в сетке).
- **Таблица с колонкой «Фото» и без «Комментарий»** → красивые **карточки** (диваны, столы).
Колонки: `№ | Название | Цена | Ссылка | Фото`. Ссылка — просто URL, кнопка подпишется сама.
+ - В «Названии» можно писать модель + описание, разделяя переносом `
`:
+ `Haier C4F640
400 л, инвертор` → модель жирным, описание — приглушённой строкой под ней.
+ - Добавь колонку **«Тип»** (или «Категория», «Техника») — карточки **автоматически сгруппируются**
+ по типу с подзаголовками (Холодильник, Духовка…). Тип пиши в первой строке группы,
+ в остальных строках этой группы ячейку «Тип» **оставляй пустой** — они наследуют тип сверху.
+ Пример для техники: `Тип | Модель | Цена | Ссылка | Фото`.
- **Таблица с колонкой «Комментарий»** → аккуратная **сравнительная таблица** (техника).
Если добавить колонку «Фото» — появятся миниатюры прямо в таблице.
- Картинка сразу перед нумерованным списком → блок **«вариант отделки»** (фото слева, список справа).
diff --git a/Ремонт квартира/Гостиная-кухня.md b/Ремонт квартира/Гостиная-кухня.md
index 01d42a2..b47658d 100644
--- a/Ремонт квартира/Гостиная-кухня.md
+++ b/Ремонт квартира/Гостиная-кухня.md
@@ -35,14 +35,14 @@ swatches: Шалфей #7C8A66, Дуб #C7A579, Кремовый #EDE8DE, Гра
### Варианты техники
-| Название | Цена | Ссылка | Фото |
-| ------------------------------------------------------------------------------------------------ | -------- | ---------------------------------------------------------------------------------- | ----------------------------------------- |
-| Варочная панель Haier | 28 000 ₽ | https://haieronline.ru/catalog/built-in/glass-ceramic-cove/hhy-y53nvb/ | ![[Pasted image 20260716000501.png\|154]] |
-| Духовка Haier HOD-PM08TGB
70 л, 8 режимов, 2 стекла | 29 000 ₽ | https://haieronline.ru/catalog/built-in/ovens/hodpm08tgb/ | ![[Pasted image 20260716000638.png\|176]] |
-| Духовка Haier HOX-P06HGBX
76 л, 6 режимов, 3 стекла | 30 000 ₽ | https://haieronline.ru/catalog/built-in/ovens/hoxp06hgbx/ | ![[Pasted image 20260716000625.png\|177]] |
-| Холодильник LG GA-B509CLSL
419 л, инвентор,
3 ящика морозилки,
нулевой зазор | 50 000 ₽ | https://www.lg.com/ru/refrigerators/lg-GA-B509CLSL# | ![[Pasted image 20260716125354.png\|159]] |
-| Холодильник HAIER C4F640CFMRGU1
400 л, инвентор,
4 ящика морозилки, нулевая зона свежести | 59 000 ₽ | https://haieronline.ru/catalog/appliances/fridges/kholodilnik-haier-c4f640cfmrgu1/ | ![[Pasted image 20260716125554.png\|155]] |
-| | | | |
+| Тип | Название | Цена | Ссылка | Фото |
+| --- | --- | --- | --- | --- |
+| Варочная панель | Haier | 28 000 ₽ | https://haieronline.ru/catalog/built-in/glass-ceramic-cove/hhy-y53nvb/ | ![[Pasted image 20260716000501.png\|154]] |
+| Духовка | Haier HOD-PM08TGB
70 л, 8 режимов, 2 стекла | 29 000 ₽ | https://haieronline.ru/catalog/built-in/ovens/hodpm08tgb/ | ![[Pasted image 20260716000638.png\|176]] |
+| | Haier HOX-P06HGBX
76 л, 6 режимов, 3 стекла | 30 000 ₽ | https://haieronline.ru/catalog/built-in/ovens/hoxp06hgbx/ | ![[Pasted image 20260716000625.png\|177]] |
+| Холодильник | LG GA-B509CLSL
419 л, инвентор,
3 ящика морозилки,
нулевой зазор | 50 000 ₽ | https://www.lg.com/ru/refrigerators/lg-GA-B509CLSL# | ![[Pasted image 20260716125354.png\|159]] |
+| | HAIER C4F640CFMRGU1
400 л, инвентор,
4 ящика морозилки, нулевая зона свежести | 59 000 ₽ | https://haieronline.ru/catalog/appliances/fridges/kholodilnik-haier-c4f640cfmrgu1/ | ![[Pasted image 20260716125554.png\|155]] |
+| | | | | |
| Техника | Ссылка | Цена | Комментарий | Фото |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ---- |