Spaces:
Sleeping
Sleeping
| export default function NodePalette({ definitions, componentTemplates, onAddNode, onAddComponentNode, onHide }) { | |
| return ( | |
| <aside className="palette"> | |
| <div className="palette__header"> | |
| <div className="palette__topline"> | |
| <div className="palette__eyebrow">React Flow</div> | |
| <button type="button" className="palette__hide-button" onClick={onHide}> | |
| Hide | |
| </button> | |
| </div> | |
| <h2 className="palette__title">Библиотека нод</h2> | |
| <p className="palette__subtitle">Добавляй ноды и собирай workflow в визуальном редакторе.</p> | |
| </div> | |
| <div className="palette__section"> | |
| <div className="palette__section-title">Основные ноды</div> | |
| <div className="palette__list"> | |
| {definitions.map((definition) => ( | |
| <button | |
| key={definition.type} | |
| type="button" | |
| className="palette__item" | |
| onClick={() => onAddNode(definition.type)} | |
| > | |
| <span className="palette__item-title">{definition.title}</span> | |
| <span className="palette__item-description">{definition.description}</span> | |
| </button> | |
| ))} | |
| </div> | |
| </div> | |
| <div className="palette__section"> | |
| <div className="palette__section-title">Компоненты</div> | |
| {componentTemplates.length > 0 ? ( | |
| <div className="palette__list"> | |
| {componentTemplates.map((template) => ( | |
| <button | |
| key={template.id} | |
| type="button" | |
| className="palette__item" | |
| onClick={() => onAddComponentNode(template.id)} | |
| > | |
| <span className="palette__item-title">{template.title}</span> | |
| <span className="palette__item-description"> | |
| {template.description?.trim() || 'Переиспользуемая компонентная нода'} | |
| </span> | |
| </button> | |
| ))} | |
| </div> | |
| ) : ( | |
| <div className="palette__empty">Сохраненные компоненты появятся здесь.</div> | |
| )} | |
| </div> | |
| </aside> | |
| ); | |
| } | |