Исправлена подсветка шаблонов, добавлен макет тестовый список, исправлены проблемы со шрифтами

- Добавлено поле template_id в модель DesignSettings
- Исправлена логика подсветки выбранного шаблона в TemplatesSelector
- Добавлен новый макет 'test-list' - полный несворачиваемый список
- Обновлены шрифты с поддержкой CSS переменных
- Создан CSS модуль для тестового списка
- Обеспечена совместимость иконок во всех макетах
This commit is contained in:
2025-11-09 11:53:17 +09:00
parent 0c1a39f07d
commit 90ac03663f
8 changed files with 429 additions and 88 deletions

View File

@@ -7,6 +7,7 @@ import Link from 'next/link'
import { useEffect, useState, Fragment } from 'react'
import FontLoader from '../components/FontLoader'
import ExpandableGroup from '../components/ExpandableGroup'
import styles from './TestListLayout.module.css'
interface LinkItem {
id: number
@@ -836,9 +837,79 @@ export default function UserPage({
</div>
)
// Тестовый список - все группы и ссылки в одном списке
const renderTestListLayout = () => (
<div className={styles.testListLayout}>
{(designSettings.show_groups_title !== false) && (
<h5 className="mb-4" style={{
color: designSettings.header_text_color || designSettings.theme_color,
fontFamily: designSettings.heading_font_family || designSettings.font_family
}}>
Все группы и ссылки
</h5>
)}
{data!.groups.map((group) => (
<div key={group.id} className={styles.linkGroup}>
{/* Заголовок группы */}
<div className={styles.groupHeader}>
{group.icon_url && designSettings.show_group_icons && (
<img
src={group.icon_url}
width={24}
height={24}
className={styles.linkIcon}
alt={group.name}
/>
)}
<span className={styles.linkTitle}>{group.name}</span>
{group.is_favorite && (
<i className="bi bi-star-fill text-warning ms-2"></i>
)}
</div>
{/* Описание группы если есть */}
{group.description && (
<p className={`${styles.linkDescription} mb-3 ps-2`}>
{group.description}
</p>
)}
{/* Ссылки группы */}
<div className={styles.groupLinks}>
{group.links.map((link) => (
<a
key={link.id}
href={link.url}
target="_blank"
rel="noopener noreferrer"
className={styles.linkItem}
>
{link.icon_url && designSettings.show_link_icons && (
<img
src={link.icon_url}
width={20}
height={20}
className={styles.linkIcon}
alt={link.title}
/>
)}
<span className={styles.linkTitle}>{link.title}</span>
{link.description && (
<small className={styles.linkDescription}>{link.description}</small>
)}
</a>
))}
</div>
</div>
))}
</div>
)
// Основная функция рендеринга групп в зависимости от выбранного макета
const renderGroupsLayout = () => {
switch (designSettings.dashboard_layout) {
case 'test-list':
return renderTestListLayout()
case 'list':
return renderListLayout()
case 'grid':
@@ -888,8 +959,17 @@ export default function UserPage({
backgroundAttachment: 'fixed',
minHeight: '100vh',
paddingTop: '2rem', // отступ сверху для рамки фона
paddingBottom: '2rem' // отступ снизу для рамки фона
}
paddingBottom: '2rem', // отступ снизу для рамки фона
// CSS переменные для использования в стилях
'--user-font-family': designSettings.font_family,
'--user-heading-font-family': designSettings.heading_font_family || designSettings.font_family,
'--user-body-font-family': designSettings.body_font_family || designSettings.font_family,
'--user-theme-color': designSettings.theme_color,
'--user-header-text-color': designSettings.header_text_color || designSettings.theme_color,
'--user-group-text-color': designSettings.group_text_color || '#333333',
'--user-link-text-color': designSettings.link_text_color || '#666666',
'--user-group-description-text-color': designSettings.group_description_text_color || '#666666'
} as React.CSSProperties
return (
<>