Back to skills
SkillHub ClubShip Full StackFull StackFrontendIntegration

ui-specialist

PySide6 UI development with dark theme, signals/slots, and NodeGraphQt integration

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
0
Hot score
74
Updated
March 20, 2026
Overall rating
C2.9
Composite score
2.9
Best-practice grade
B77.6

Install command

npx @skill-hub/cli install omerlefaruk-casarerpa-ui-specialist

Repository

omerlefaruk/CasareRPA

Skill path: .opencode/skill/ui-specialist

PySide6 UI development with dark theme, signals/slots, and NodeGraphQt integration

Open repository

Best for

Primary workflow: Ship Full Stack.

Technical facets: Full Stack, Frontend, Integration.

Target audience: everyone.

License: MIT.

Original source

Catalog source: SkillHub Club.

Repository owner: omerlefaruk.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install ui-specialist into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/omerlefaruk/CasareRPA before adding ui-specialist to shared team environments
  • Use ui-specialist for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: ui-specialist
description: PySide6 UI development with dark theme, signals/slots, and NodeGraphQt integration
license: MIT
compatibility: opencode
metadata:
  audience: developers
  workflow: ui
---

## What I do

- Create PySide6 widgets and UI components
- Implement dark theme styling with THEME constants
- Design proper signal/slot connections
- Integrate with NodeGraphQt visual nodes

## When to use me

Use this when you need to:
- Create custom node widgets
- Design property editors
- Implement dialogs and panels
- Style UI with dark theme

## MCP-First Workflow

Always use MCP servers in this order:

1. **codebase** - Search for UI patterns
   ```python
   search_codebase("PySide6 widget dark theme signals slots", top_k=10)
   ```

2. **filesystem** - view_file existing UI code
   ```python
   read_file("src/casare_rpa/presentation/canvas/graph/node_widgets.py")
   ```

3. **git** - Check UI changes
   ```python
   git_diff("HEAD~5..HEAD", path="src/casare_rpa/presentation/canvas/")
   ```

4. **ref** - PySide6 documentation
   ```python
   search_documentation("widget", library="PySide6")
   ```

## Widget Template

```python
from PySide6.QtWidgets import QWidget, QVBoxLayout, QLabel, QLineEdit
from PySide6.QtCore import Signal, Slot

class CustomNodeWidget(QWidget):
    value_changed = Signal(str)

    def __init__(self, parent=None):
        super().__init__(parent)
        self._setup_ui()

    def _setup_ui(self):
        layout = QVBoxLayout(self)
        layout.setContentsMargins(4, 4, 4, 4)

        self.label = QLabel("Input:")
        self.input = QLineEdit()
        self.input.textChanged.connect(self._on_value_changed)

        layout.addWidget(self.label)
        layout.addWidget(self.input)

    @Slot(str)
    def _on_value_changed(self, value: str):
        self.value_changed.emit(value)

    def get_value(self) -> str:
        return self.input.text()

    def set_value(self, value: str):
        self.input.setText(value)
```

## Dark Theme (Use THEME Constants!)

```python
from casare_rpa.presentation.canvas.ui.theme import THEME

self.setStyleSheet(f"""
    QLineEdit {{
        background: {THEME.bg_darker};
        color: {THEME.text_primary};
        border: 1px solid {THEME.border};
        border-radius: 4px;
        padding: 4px;
    }}
    QLineEdit:focus {{
        border-color: {THEME.accent};
    }}
""")
```

## Signal/Slot Best Practices

| Pattern | Do | Don't |
|---------|-----|-------|
| Parameters | Use `@Slot(type)` decorator | Use bare `connect()` |
| Lambdas | Avoid (captures!) | `value_changed.connect(lambda v: ...)` |
| Threading | Use `Qt.QueuedConnection` | Direct calls cross-thread |
| Disconnecting | Store connection | Let it GC |

```python
# CORRECT
from functools import partial

def _setup_connections(self):
    self.input.textChanged.connect(partial(self._on_value_changed, self))

@Slot(str)
def _on_value_changed(self, value: str):
    pass
```
ui-specialist | SkillHub