Building the UI =============== ForkBit plugins use standard PySide6 widgets. The app's theme cascades automatically — your widgets look native without any extra styling. Replace the content of ``main.py``: .. code-block:: python from PySide6.QtCore import Qt from PySide6.QtWidgets import ( QHBoxLayout, QLabel, QLineEdit, QPlainTextEdit, QPushButton, QVBoxLayout, ) from forkbit_sdk import BasePlugin class ReleaseNotesPlugin(BasePlugin): def on_ready(self) -> None: layout = QVBoxLayout(self.container) layout.setContentsMargins(24, 24, 24, 24) layout.setSpacing(16) # Version input version_row = QHBoxLayout() version_row.addWidget(QLabel("Version:")) self.version_input = QLineEdit() self.version_input.setPlaceholderText("e.g. 1.0.0") version_row.addWidget(self.version_input) layout.addLayout(version_row) # Notes editor layout.addWidget(QLabel("Release Notes:")) self.editor = QPlainTextEdit() self.editor.setPlaceholderText("What's new in this release?") layout.addWidget(self.editor) # Action buttons button_row = QHBoxLayout() button_row.addStretch() save_btn = QPushButton("Save Draft") save_btn.clicked.connect(self._on_save) button_row.addWidget(save_btn) publish_btn = QPushButton("Publish") publish_btn.setProperty("class", "primary") publish_btn.clicked.connect(self._on_publish) button_row.addWidget(publish_btn) layout.addLayout(button_row) def _on_save(self) -> None: self.notify("Draft saved.", level="success") def _on_publish(self) -> None: version = self.version_input.text().strip() if not version: self.notify("Please enter a version number.", level="warning") return self.notify(f"Published v{version}!", level="success") Styling tips ------------ - Use ``setProperty("class", "primary")`` for primary-styled buttons - Use spacing constants: 4, 8, 12, 16, 24, 32 px - Set ``setObjectName()`` on widgets if you need to target them with QSS - Don't use ``setStyleSheet()`` — the app's theme handles styling Your plugin now has a functional editor UI. Next: :doc:`settings`.