kobar-project/kobar/kobar-ui-ux-designer

Claude Code and agent skill by kobar-project/kobar

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Guide for writing UI for the KoBar host app (remastered design system, KoBar 1.4.0 and later). Covers the three windows and where state lives, the --kb-* tokens and Tailwind utilities, the src/ui primitives with TSX examples, z-index layers, motion, focus ring, accessibility, icons, typography, i18n (locale JSON + useT), platform differences, and the known exceptions in current code. Use it when building or reviewing any KoBar host UI.

Install

npx vskill@latest install kobar-project/kobar/kobar-ui-ux-designer

SKILL.md

KoBar UI Guide (remastered design system)

Visual rules: KoBar now uses the Canlı visual language. Colours, shapes, type, icons, the bar's tiles and the
card/panel patterns are defined in the Canlı design guide; where this guide and
that one disagree on a visual rule, Canlı wins. The structural rules below (windows, state, hit-testing, i18n,
layers, primitives) still apply.

This file documents the KoBar design system for agents writing host UI in src/. The source of truth is the design tokens in src/index.css and the primitives in src/ui/. It documents the current system; it is not binding on plugin authors. Plugin authors follow for-agents/kobar-plugin-developer/SKILL.md. Anything marked LEGACY below exists only so v1 plugins keep working; never use it in new host code.

1. Character

Native-calm: a quiet shell, with colour only for state, selection, focus and the single primary action. No glow, no gradients, no grow-on-hover, no decorative animation. Light and dark schemes both exist; never assume dark. Corners are modest (6 / 8 / 12 / 16 px), not "as round as possible".

2. Windows and where state lives

KoBar renders host UI in three windows. Know which one you are in before you read state or add an interaction.

WindowEntryStateNotes
Main (bar, notes, plugin panels)index.html, src/main.tsx, src/App.tsxuseAppStore (persisted, migrated)Transparent click-through overlay (section 12). The only window with the plugin runtime and window.api. Mounts the one <ToastRegion>.
Settingssettings.html, src/settings/main.tsx, src/settings/SettingsApp.tsx, pages in src/settings/pages/No `useAppStore`. Read the main window's mirrored snapshot with useSettingsState(selector) / useSystemSummary(); change things only through dispatchSettingsAction, dispatchPluginAction, dispatchSystemAction (src/settings/mirror.ts). Actions are allow-listed and validated by the main window.Normal framed window with its own narrow preload; no plugin runtime, no toasts. Pages receive t through SettingsPageProps. Anything that needs plugin code (a plugin's settings panel, the GitHub install form) is opened in the main window via an action.
PiPpip.html, src/pip/Local onlyMini browser for KoPlayer; narrow preload.

3. Root attributes (set on :root, do not set them in components)

AttributeValues
data-schemedark / light
data-accentamber (default) orange red pink violet blue green graphite custom
data-densitycompact / normal / comfortable
data-materialsolid / translucent (bar and panel shells only)
data-platformwin32 / darwin / linux (set by setDocumentPlatform, src/platform.ts, before the first render)
data-theme, data-designLEGACY, kept read-only for v1 plugins (data-design = style1/style2, the v1 view of material)

Components never branch on these; the tokens change underneath them. In JS, use isMacPlatform() / getDocumentPlatform() from src/platform.ts when behaviour (not styling) depends on the platform.

4. Tokens and utilities

Use semantic utilities. Never use raw palette utilities (bg-slate-800, text-white, bg-blue-500) for structure.

NeedUtility (token)
Bar / panel backgroundbg-shell (--kb-bg-shell)
Card, popover, menu, dialogbg-surface (--kb-bg-surface)
Input, editor backgroundbg-inset (--kb-bg-inset)
Texttext-fg-1 (primary), text-fg-2 (secondary, icons), text-fg-3 (placeholder/disabled only, never meaningful text)
Borderborder-stroke (subtle decorative, --kb-stroke-subtle); --kb-stroke-strong; form control borders use --kb-stroke-control (primitives do this)
Elevationshadow-e1 card, shadow-e2 tooltip/menu/popover, shadow-e3 bar/panel/dialog; always with a 1 px subtle stroke
Accentvar(--kb-accent) (e.g. bg-[var(--kb-accent)]); text on accent is --kb-on-accent; --kb-accent-hover, --kb-accent-pressed, --kb-accent-subtle
Status--kb-success, --kb-warning, --kb-danger, --kb-info (always paired with an icon or text). Only danger has utilities (text-danger, bg-danger); write the others as text-[var(--kb-success)]
Interaction fillsbg-fill-hover, bg-fill-selected (utilities); --kb-fill-pressed, --kb-accent-subtle (via var())
Radiusrounded-xs 4 (checkbox), rounded-sm 6 (button/input), rounded-md 8 (row, card, bar item), rounded-lg 12 (panel, popover, dialog), rounded-xl 16 (bar shell), rounded-full (avatar, Toggle, mini-mode button)
SpacingTailwind 4 px scale only (0.5, 1, 2, 3, 4, 5, 6, 8, 10). No arbitrary values like p-[13px]. Panel padding 16, row vertical 8-10, between controls 8, between groups 24
Density-driven sizes--kb-bar-thickness, --kb-bar-item, --kb-bar-icon, --kb-control-h, --kb-row-h (change with data-density)
Blur (translucent material)backdrop-blur-(--kb-blur-bar), --kb-blur-eye, --kb-blur-notification, --kb-blur-toggle; macOS gets lighter values automatically. Never hard-code a blur radius.
Other--kb-scrim (dialog backdrop), --kb-opacity-disabled, --kb-opacity-drag

Colour rules:

  • ESLint forbids `#hex` and `rgb(`/`rgba(` inside any JSX `className` (string or template literal, including

conditionals; eslint.config.js, error level). If you need a colour, use a token utility or bg-[var(--kb-...)].

  • The accent never paints backgrounds of large areas; it marks selection, focus and the one primary action.
  • On a translucent shell, accent is never the only signal for state; add an icon, fill or text. Cards with text stay solid.
  • Never use pure black text. Use text-fg-1.
  • Contrast: text 4.5:1, controls/indicators 3:1. If you add a colour, compute it.

5. Typography

  • System font stack via tokens (--kb-font, --kb-font-display, --kb-font-mono); Segoe UI Variable on Windows, SF Pro on

macOS (the darwin block reorders the stack). The body default is already set; do not apply font-display or a font family.

  • Roles: caption 11/16, body 13/20, body-strong 13/20 weight 600 (buttons, row titles, section headers in sentence case, text-fg-2), subtitle 15/22 (panel title), title 20/28, display 28/36 (note title only).
  • No uppercase, wide-tracked micro labels (text-[10px] uppercase tracking-wider is gone).
  • LEGACY: Space Grotesk stays only as an @font-face alias for v1 plugins. Host code never uses it.

6. Icons

  • Material Symbols Outlined, loaded locally (variable font, default wght 300, opsz 20).
  • Use <Icon>; sizes 16 / 20 / 24 only. Active/selected state uses filled (FILL axis 1), not a different icon.
  • Icon names are part of the plugin contract; the family does not change. Do not add SVG icon libraries.
  • Decorative icons are hidden from assistive tech automatically; give label only if the icon alone carries meaning.
tsx
<Icon name="settings" size={20} />
<Icon name="star" filled size={16} />
<Icon name="warning" size={20} label={t('status.warning')} />

7. Primitives (import { ... } from '../ui' / src/ui/index.ts)

All primitives use only --kb-* tokens and already apply no-drag-region, pointer-events-auto, the focus ring and reduced-motion handling. Do not re-add those classes on top. Primitives contain no i18n: pass translated strings.

Pick the primitive first; hand-written <button className=...> is the exception.

NeedUse
Text actionButton (variant: primary / secondary / subtle / danger; size: sm / md; icon, loading, fullWidth). At most one `primary` per screen.
Icon-only actionIconButton (icon, `label` required, size 28/32/40, pressed, tooltip (false to hide, or a string), tooltipSide). Label is the aria-label and default tooltip.
ContainerSurface (as, level shell/surface/inset, elevation e0..e3, radius none/sm/md/lg/xl, material (boolean, shells only))
Hint on hover/focusTooltip (content, one focusable child, side auto/top/bottom/left/right, delay, disabled, describe)
On/off settingToggle (checked, onChange(checked), label required, description, hideLabel, fullWidth)
List/settings rowListItem (title, description, leading, trailing, onClick, selected, current, disabled, as="li")
Switch viewsTabs (variant underline/segmented, items, value, onChange, fullWidth)
Choose 1 of fewSegmented (items, value, onChange, fullWidth)
Text inputTextField (label required, hideLabel, hint, error, icon)
Dropdown choiceSelect (label required, options or <option> children, hint, error)
Anchored floating contentPopover (trigger, placement, open/defaultOpen/onOpenChange, initialFocus, returnFocus; usePopoverClose() inside)
Action listMenu (trigger, items: item / checkbox / radio / separator)
Blocking dialogDialog (open, onClose(reason), title, description, footer, size sm/md/lg, closeLabel, role dialog/alertdialog)
Confirm a (destructive) actionConfirmDialog (danger focuses Cancel first; loading)
Transient feedbacktoast.success/info/warning/error(message, opts) + the one <ToastRegion dismissLabel=... /> (main window only)
Nothing to showEmptyState (icon, title, description, action)
Loading placeholderSkeleton (shape line/block/circle, width, height, lines); static, no shimmer
Host panelPanelShell (see section 8)

Examples:

tsx
// Primary + secondary action, with an icon and a loading state
<Button variant="primary" icon="add" loading={saving} onClick={save}>{t('save')}</Button>
<Button variant="secondary" onClick={close}>{t('cancel')}</Button>
// Icon-only button: label is mandatory; pressed = toggle state
<IconButton icon="push_pin" label={t('pinToggle')} pressed={pinned} onClick={togglePin} />
// Setting row with a Toggle; hideLabel because the row already shows the title
<ListItem
title={t('settingsSound')}
description={t('settingsSoundHint')}
trailing={<Toggle checked={sound} onChange={setSound} label={t('settingsSound')} hideLabel />}
/>
// Form fields
<TextField label={t('noteTitle')} value={title} onChange={(e) => setTitle(e.target.value)} error={err} />
<Select label={t('settingsEdge')} value={edge} onChange={(e) => setEdge(e.target.value)}
options={[{ value: 'left', label: t('edgeLeft') }, { value: 'right', label: t('edgeRight') }]} />
// Tabs / Segmented are controlled
<Segmented items={[{ value: 'a', label: t('optionA') }, { value: 'b', label: t('optionB'), icon: 'list' }]} value={v} onChange={setV} />
// Menu with a destructive item
<Menu
aria-label={t('noteMenu')}
trigger={<IconButton icon="more_vert" label={t('more')} />}
items={[
{ id: 'rename', label: t('rename'), onSelect: rename },
{ type: 'separator' },
{ id: 'delete', label: t('delete'), danger: true, onSelect: askDelete },
]}
/>
// Destructive confirmation (every string from src/i18n/locales/*.json via t)
<ConfirmDialog open={open} danger title={t('deleteConfirmMsg')} confirmLabel={t('delete')}
cancelLabel={t('cancel')} onConfirm={doDelete} onCancel={() => setOpen(false)} />
// Toasts: the main window mounts <ToastRegion> once; call from anywhere in that window
toast.success(t('noteSaved'), { action: { label: t('undo'), onClick: undo } });
// Container and empty state
<Surface level="surface" elevation="e1" radius="md" className="p-4">...</Surface>
<EmptyState icon="inbox" title={t('pluginsNone')} action={<Button onClick={browse}>{t('pluginsBrowse')}</Button>} />

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
68
Repository forks
7
7-day trend score
21

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/kobar-project/kobar/kobar-ui-ux-designer/badge)](https://verified-skill.com/skills/kobar-project/kobar/kobar-ui-ux-designer)

Something wrong with this skill or its page? Tell us.