Separate tree nodes into independent panels, remove graph local search, UI improvements

- Split Sources tab: raw/raw_templates, processed/proc_templates each get own panel
- Split Targets tab: led-devices, led-targets, kc-targets, kc-patterns each get own panel
- Remove graph local search — search button and / key open global command palette
- Add graphNavigateToNode for command palette → graph node navigation
- Add tree group expand/collapse animation (max-height + opacity transition)
- Make tree group headers visually distinct (smaller, uppercase, left border on children)
- Make CardSection collapse opt-in via collapsible flag (disabled by default)
- Move filter textbox next to section title (remove margin-left: auto)
- Fix notification bell button vertical centering in test preview
- Fix clipboard copy on non-HTTPS with execCommand fallback
- Add overlay toggle button on picture-based CSS cards
- Add CSPT to graph add-entity picker and global search
- Update all cross-link navigation paths for new panel keys
- Add i18n keys for new tree groups and search groups (en/ru/zh)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 12:32:13 +03:00
parent 3292e0daaf
commit 6c7b7ea7d7
12 changed files with 127 additions and 185 deletions
@@ -732,11 +732,15 @@ body.pp-filter-dragging .pp-filter-drag-handle {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
cursor: default;
user-select: none;
padding: 8px 0;
}
.cs-header:has(.cs-chevron) {
cursor: pointer;
}
/* Prevent sticky header from clipping cards that lift on hover */
[data-cs-content] {
padding-top: 4px;
@@ -783,7 +787,6 @@ body.pp-filter-dragging .pp-filter-drag-handle {
.cs-filter-wrap {
position: relative;
margin-left: auto;
width: 180px;
max-width: 40%;
flex-shrink: 0;
@@ -30,6 +30,10 @@
margin-bottom: 2px;
}
.tree-group:first-child > .tree-group-header {
margin-top: 0;
}
.tree-group-header {
display: flex;
align-items: center;
@@ -37,13 +41,14 @@
padding: 6px 10px;
cursor: pointer;
user-select: none;
font-size: 0.78rem;
font-weight: 600;
color: var(--text-secondary);
font-size: 0.72rem;
font-weight: 700;
color: var(--text-muted);
border-radius: 6px;
transition: color 0.15s, background 0.15s;
text-transform: uppercase;
letter-spacing: 0.03em;
letter-spacing: 0.05em;
margin-top: 6px;
}
.tree-group-header:hover {
@@ -98,21 +103,28 @@
.tree-children {
overflow: hidden;
margin-left: 14px;
border-left: 1px solid var(--border-color);
padding-left: 0;
max-height: 500px;
opacity: 1;
transition: max-height 0.25s ease, opacity 0.2s ease;
}
.tree-children.collapsed {
display: none;
max-height: 0;
opacity: 0;
}
.tree-leaf {
display: flex;
align-items: center;
gap: 6px;
padding: 5px 10px 5px 26px;
padding: 5px 10px 5px 12px;
cursor: pointer;
font-size: 0.8rem;
color: var(--text-secondary);
border-radius: 6px;
border-radius: 0 6px 6px 0;
margin: 1px 0;
transition: color 0.15s, background 0.15s;
}
@@ -243,6 +255,12 @@
display: flex;
flex-wrap: wrap;
gap: 2px;
margin-left: 0;
border-left: none;
padding-left: 0;
max-height: none;
opacity: 1;
transition: none;
}
.tree-children.collapsed {