design-shiny-ui
정보
이 스킬은 개발자가 bslib와 Bootstrap 5 테마를 사용하여 현대적이고 접근성 높은 Shiny UI를 만들 수 있도록 돕습니다. layout_columns(), 카드 컴포넌트를 활용한 반응형 레이아웃과 WCAG 준수를 위한 모범 사례를 제공합니다. 일관된 브랜딩이나 향상된 접근성이 필요한 전문적인 외관의 애플리케이션을 개발할 때 사용하세요.
빠른 설치
Claude Code
추천npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/design-shiny-uiClaude Code에서 이 명령을 복사하여 붙여넣어 스킬을 설치하세요
문서
name: design-shiny-ui description: > Moderne, zugängliche Shiny-Benutzeroberflächen mit bslib-Themes, responsivem Layout und Barrierefreiheits-Best-Practices gestalten. Behandelt Bootstrap- 5-Theming, layout_columns(), Cards und WCAG-Konformität. Verwenden, wenn eine Shiny-App professionell wirken soll, ein Marken-Theme konsistent angewendet oder die Zugänglichkeit für alle Nutzer verbessert werden soll. license: MIT locale: de source_locale: en source_commit: 6f65f316 translator: claude-opus-4-6 translation_date: 2026-03-16 allowed-tools: Read Write Edit Bash Grep Glob metadata: author: Philipp Thoss version: "1.0" domain: shiny complexity: intermediate language: R tags: shiny, ui, bslib, theming, accessibility, bootstrap
Shiny-UI gestalten
Moderne, zugängliche und visuell ansprechende Shiny-Benutzeroberflächen mit bslib und Bootstrap 5 erstellen.
Wann verwenden
- Shiny-App professionell und markenkonform gestalten
- Responsives Layout für verschiedene Bildschirmgrößen einrichten
- Zugänglichkeit (WCAG 2.1 AA) sicherstellen
- Konsistentes Design über mehrere Apps implementieren
Eingaben
- Erforderlich: Shiny-App (scaffolded oder bestehend)
- Optional: Markenfarben und Typografie (Hex-Codes, Schriftarten)
- Optional: Design-System oder Style-Guide
- Optional: Zugänglichkeits-Anforderungen
Vorgehensweise
Schritt 1: bslib installieren und Bootstrap 5 aktivieren
bslib für modernes Bootstrap-5-Theming einrichten.
install.packages("bslib")
# Grundlegendes bslib-Setup in app.R oder app_ui.R
library(shiny)
library(bslib)
ui <- page_sidebar( # Modernes Layout mit bslib
title = "Meine App",
sidebar = sidebar(
selectInput("dataset", "Datensatz:", choices = c("iris", "mtcars"))
),
# Hauptinhalt
card(
card_header("Datenübersicht"),
tableOutput("table")
)
)
Erwartet: App verwendet Bootstrap 5. Modernes, responsives Grundlayout.
Bei Fehler: Wenn bslib und shiny Version inkompatibel sind, packageVersion("bslib") und packageVersion("shiny") prüfen — bslib >= 0.5.0 für volle Bootstrap-5-Unterstützung.
Schritt 2: Custom Theme erstellen
Markenspezifisches Bootstrap-5-Theme konfigurieren.
# Marken-Theme definieren
mein_theme <- bs_theme(
version = 5,
# Grundlegende Markenfarben
bg = "#FFFFFF", # Hintergrund
fg = "#212529", # Vordergrund (Text)
primary = "#0066CC", # Primärfarbe
secondary = "#6C757D", # Sekundärfarbe
success = "#28A745",
warning = "#FFC107",
danger = "#DC3545",
# Typografie
base_font = font_google("Inter"),
heading_font = font_google("Inter", wght = 600),
code_font = font_google("JetBrains Mono"),
# Benutzerdefinierte Sass-Variablen
"border-radius" = "0.5rem",
"box-shadow" = "0 2px 4px rgba(0,0,0,0.1)"
)
# Theme in App verwenden
ui <- page_sidebar(
theme = mein_theme,
title = "Meine App",
# ...
)
Theme live im Browser anpassen:
# Interaktiver Theme-Editor (nur Entwicklung)
bs_themer() # Fügt Theming-Widget zur App hinzu
Erwartet: App zeigt benutzerdefinierte Farben und Typografie. bs_themer() zeigt interaktive Theme-Kontrollen.
Bei Fehler: Wenn Google Fonts nicht laden (kein Internet), font_google() durch font_collection("system-ui", "sans-serif") ersetzen.
Schritt 3: Responsives Layout mit Cards und Columns
Flexibles, responsives Layout mit bslib-Komponenten erstellen.
ui <- page_sidebar(
theme = mein_theme,
title = "Dashboard",
sidebar = sidebar(
width = 300, # Sidebar-Breite in Pixeln
bg = "#f8f9fa",
selectInput("dataset", "Datensatz:", choices = c("iris", "mtcars")),
sliderInput("rows", "Zeilen:", min = 5, max = 50, value = 10),
hr(),
actionButton("refresh", "Aktualisieren", class = "btn-primary w-100")
),
# Responsives 2-Spalten-Layout
layout_columns(
col_widths = c(8, 4), # 8/12 + 4/12 Bootstrap-Spalten
card(
full_screen = TRUE, # Vollbild-Erweiterungsbutton
card_header(
"Hauptdiagramm",
class = "bg-primary text-white"
),
plotOutput("main_plot", height = "400px")
),
layout_columns(
col_widths = c(12, 12), # Gestapelte Cards auf rechter Seite
value_box(
title = "Datenpunkte",
value = textOutput("n_points"),
showcase = bsicons::bs_icon("bar-chart"),
theme = "primary"
),
card(
card_header("Zusammenfassung"),
tableOutput("summary_table")
)
)
)
)
Erwartet: Responsives 2-Spalten-Layout auf Desktop. Gestapelt auf Mobile.
Bei Fehler: Wenn Spalten nicht korrekt brechen, col_widths überprüfen — Summe muss 12 oder weniger ergeben (Bootstrap-12-Spalten-Grid).
Schritt 4: Interaktionselemente gestalten
Moderne UI-Komponenten mit Bootstrap-5-Styling hinzufügen.
# Navigation mit Tabs
page_navbar(
theme = mein_theme,
title = "Meine App",
nav_panel(
"Übersicht",
icon = bsicons::bs_icon("house"),
# Inhalt der Übersichtsseite
),
nav_panel(
"Analyse",
icon = bsicons::bs_icon("graph-up"),
# Analyseinhalt
),
nav_spacer(),
nav_item(
tags$a(href = "https://docs.example.com", "Dokumentation",
target = "_blank")
)
)
# Gestylte Buttons
fluidRow(
actionButton("primary_btn", "Primär", class = "btn-primary"),
actionButton("outline_btn", "Umriss", class = "btn-outline-secondary ms-2"),
downloadButton("download", "Herunterladen", class = "btn-success ms-2")
)
# Tooltips und Popovers
tags$button(
class = "btn btn-info",
`data-bs-toggle` = "tooltip",
`data-bs-placement` = "top",
title = "Hilfreiche Erklärung",
bsicons::bs_icon("question-circle")
)
Erwartet: Moderne UI-Elemente mit korrektem Bootstrap-5-Styling.
Bei Fehler: Wenn Tooltips nicht erscheinen, Bootstrap-5-JavaScript muss aktiviert sein. bs_dependency_defer() oder manuelle JS-Initialisierung verwenden.
Schritt 5: Zugänglichkeit sicherstellen
WCAG 2.1 AA-Konformität für alle Nutzer implementieren.
# Semantisches HTML mit ARIA-Labels
ui <- page_sidebar(
theme = mein_theme,
# Skip-Navigation-Link
tags$a(
href = "#main-content",
class = "visually-hidden-focusable",
"Zum Hauptinhalt springen"
),
sidebar = sidebar(
# Label für Seitenleiste
tags$div(
role = "region",
`aria-label` = "Filteroptionen",
selectInput("dataset", "Datensatz auswählen:", choices = c("iris", "mtcars"))
)
),
tags$main(
id = "main-content",
role = "main",
`aria-label` = "Hauptinhalt",
# Beschreibende Alt-Texte für Plots
plotOutput(
"main_plot",
alt = "Streudiagramm der ausgewählten Datensatz-Variablen"
),
# Tabellen mit Überschriften
tags$div(
role = "region",
`aria-label` = "Datentabelle",
tableOutput("data_table")
)
)
)
Farbkontrast prüfen:
# Kontrastverhältnisse verifizieren (WCAG AA: min 4.5:1 für normalen Text)
# Externes Tool: https://webaim.org/resources/contrastchecker/
# Farbenblindheitssichere Paletten
colorblind_palette <- c(
"#E69F00", "#56B4E9", "#009E73",
"#F0E442", "#0072B2", "#D55E00", "#CC79A7"
)
Erwartet: App navigierbar mit Tastatur. Screen Reader-Nutzer können Inhalt verstehen. Farben haben ausreichenden Kontrast.
Bei Fehler: Wenn ARIA-Labels nicht erkannt werden, HTML-Ausgabe mit view_ui <- function(ui) htmltools::html_print(ui) untersuchen.
Schritt 6: Theme über Apps hinweg wiederverwenden
Theme in R-Paket oder shared Skript packen.
# R/theme.R (in golem-Paket oder gemeinsames Skript)
#' Unternehmensspezifisches bslib-Theme
#' @export
get_company_theme <- function() {
bs_theme(
version = 5,
primary = "#0066CC",
base_font = font_google("Inter"),
heading_font = font_google("Inter", wght = 600)
)
}
# In jeder App verwenden
ui <- page_sidebar(
theme = get_company_theme(),
# ...
)
# CSS-Überschreibungen für app-spezifische Anpassungen
ui <- page_sidebar(
theme = bs_theme_update(
get_company_theme(),
# App-spezifische Überschreibungen
"sidebar-bg" = "#f0f4f8"
)
)
Erwartet: Konsistentes Design über alle Unternehmens-Apps. Theme in einzelner Datei wartbar.
Bei Fehler: Wenn Theme-Überschreibungen nicht wirken, CSS-Spezifität prüfen — bslib-Sass-Variablen haben Vorrang vor Bootstrap-Defaults.
Validierung
- App verwendet Bootstrap 5 via bslib
- Custom Theme mit Markenfarben und Typografie konfiguriert
- Responsives Layout bricht korrekt auf mobilen Bildschirmen
- Navigation mit Tastatur vollständig möglich
- Farb-Kontrastverhältnisse erfüllen WCAG 2.1 AA (4.5:1)
- ARIA-Labels für nicht-textuelle Elemente vorhanden
- Theme in wiederverwendbarer Funktion oder Paket
Haeufige Stolperfallen
- Bootstrap-Version-Mischung: Nicht Bootstrap 4 und 5 mischen. bslib-Themes erfordern konsistente Bootstrap-Version.
- Inline-CSS vs Sass-Variablen: Inline-CSS kann bslib-Theming überschreiben. Sass-Variablen über
bs_theme()bevorzugen. - Google Fonts in Offline-Umgebungen:
font_google()benötigt Internet. Für Offline-Einsatz lokale Schriften inwww/fonts/verwenden. - Kontrast-Checker für Markenfarben: Markenfarben erfüllen nicht immer WCAG-Kontrastverhältnisse. Immer mit Tool prüfen.
- Cards und full_screen:
full_screen = TRUEerfordert Inhalt mit definierten Höhen, sonst unbegrenzte Ausdehnung. - value_box in Modulen:
value_box()IDs überns()korrekt namespace.
Verwandte Skills
scaffold-shiny-app— App vor UI-Design scaffoldenbuild-shiny-module— Modulstruktur für wiederverwendbare UI-Komponentenoptimize-shiny-performance— Performance nach UI-Fertigstellung optimieren
GitHub 저장소
연관 스킬
executing-plans
디자인executing-plans 스킬은 검토 체크포인트가 포함된 통제된 배치로 실행할 완전한 구현 계획이 있을 때 사용합니다. 이 스킬은 계획을 불러와 비판적으로 검토한 후, 소규모 배치(기본값 3개 작업)로 작업을 실행하면서 각 배치 사이에 진행 상황을 아키텍트 검토를 위해 보고합니다. 이를 통해 내재된 품질 관리 체크포인트를 갖춘 체계적인 구현이 보장됩니다.
requesting-code-review
디자인이 스킬은 코드 변경 사항을 요구 사항에 따라 분석하기 위해 코드 리뷰어 하위 에이전트를 호출합니다. 작업 완료 후, 주요 기능 구현 후, 또는 메인 브랜치에 병합하기 전에 사용해야 합니다. 이 리뷰는 현재 구현체와 원래 계획을 비교하여 문제를 조기에 발견하는 데 도움이 됩니다.
connect-mcp-server
디자인이 스킬은 개발자들이 HTTP, stdio 또는 SSE 전송 방식을 통해 MCP 서버를 Claude Code에 연결하는 포괄적인 가이드를 제공합니다. GitHub, Notion 및 사용자 정의 API와 같은 외부 서비스를 통합하기 위한 설치, 구성, 인증 및 보안을 다룹니다. MCP 통합 설정, 외부 도구 구성 또는 Claude의 모델 컨텍스트 프로토콜 작업 시 활용하세요.
web-cli-teleport
디자인이 스킬은 작업 분석을 기반으로 개발자가 Claude Code 웹 인터페이스와 CLI 인터페이스 중 선택할 수 있도록 돕고, 두 환경 간 원활한 세션 텔레포트를 가능하게 합니다. 웹, CLI 또는 모바일 환경 전환 시 세션 상태와 컨텍스트를 관리하여 워크플로를 최적화합니다. 다양한 단계에서 서로 다른 도구가 필요한 복잡한 프로젝트에 사용하세요.
