From craft-workspace-webconsulting-skills
Applies webconsulting.at design system: square surfaces, Hanken Grotesk, teal/ink tokens, invoice-led hierarchy, dark mode, accessibility, shadcn/ui. Use for webconsulting pages, internal tools, GitLab themes, TYPO3 templates.
How this skill is triggered — by the user, by Claude, or both
Slash command
/craft-workspace-webconsulting-skills:webconsulting-brandingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Source: https://github.com/dirnbauer/webconsulting-skills
The current webconsulting language is flat, square, precise, and content-led. It uses typography, spacing, surface color, and filled emphasis to create hierarchy. Decorative borders and rounded cards are legacy styling.
When references disagree, use this order:
track.webconsulting.at and the GitLab theme.webconsulting.at site for editorial layout, marketing pages, and large-scale composition.Inspect the live surface when it is available. Do not reintroduce an older pattern merely because it already exists in a component library.
border-radius: 0 and Tailwind rounded-none.Do not generate:
border, border-*, divide-*, or card outlines for visual groupingrounded, rounded-md, rounded-lg, pill cards, or rounded table shellsborder-top, signature rule, or cyan/teal stripeNative document separators, chart axes, diagram edges, underlined text links, and focus outlines are not decorative container borders. Use them only when they carry meaning.
Persona: innovative, technical, professional; a senior solutions architect.
Tone: clear, concise, specific, and authoritative. Avoid marketing fluff.
Language: German for public and business-facing content; English for technical documentation unless the project specifies otherwise.
| Token | Light | Dark | Use |
|---|---|---|---|
--webcon-primary | #1b7a95 | #66c4e1 | Primary actions, links, active states |
--webcon-primary-dark | #155d73 | #9dd8eb | Hover states, strong teal text |
--webcon-primary-strong | #0f4555 | #c5e8f2 | Deep brand surfaces |
--webcon-accent | #66c4e1 | #66c4e1 | Header signature, non-text accents |
--webcon-primary-pale | #e8f4f8 | #0f3d4a | Selected and informational surfaces |
--webcon-canvas | #f5f8f9 | #071f26 | App background |
--webcon-surface | #ffffff | #0f252c | Main reading surface |
--webcon-surface-muted | #eef2f3 | #16343d | Navigation and metadata bands |
--webcon-ink | #171a1d | #f8fafb | Primary text |
--webcon-muted | #5e6870 | #b8c5ca | Secondary text |
Light cyan is an accent, not body text on white. Verify contrast before using any brand color for text.
| State | Foreground | Light surface | Dark surface |
|---|---|---|---|
| Success | #166534 | #dcfce7 | #14532d |
| Error | #b42318 | #fee2e2 | #450a0a |
| Warning | #9a4a00 | #fef3c7 | #451a03 |
| Info | #155d73 | #e8f4f8 | #0f3d4a |
Express state with a filled surface, icon, label, and text. Do not use a colored border as the only signal.
:root {
--webcon-primary: #1b7a95;
--webcon-primary-dark: #155d73;
--webcon-primary-strong: #0f4555;
--webcon-accent: #66c4e1;
--webcon-primary-pale: #e8f4f8;
--webcon-canvas: #f5f8f9;
--webcon-surface: #ffffff;
--webcon-surface-muted: #eef2f3;
--webcon-ink: #171a1d;
--webcon-muted: #5e6870;
--radius: 0;
}
*, *::before, *::after {
border-radius: 0;
}
Do not apply a global border: 0; that can erase meaningful controls, focus
indicators, chart axes, and third-party widgets. Remove decorative borders at the
component level.
Use Hanken Grotesk throughout the product and public site.
| Role | Weight | Guidance |
|---|---|---|
| Body | 400 | 16px base, 1.5-1.65 line height |
| Display and page headings | 500-650 | Tight tracking, compact line height |
| UI labels and secondary headings | 600-650 | Short and scannable |
| Primary actions and table headers | 650-700 | Reserve for emphasis |
| Code and identifiers | 400-700 | JetBrains Mono or system monospace |
import { Hanken_Grotesk } from 'next/font/google'
export const hankenGrotesk = Hanken_Grotesk({
subsets: ['latin'],
variable: '--font-hanken-grotesk',
display: 'swap',
})
--font-sans: var(--font-hanken-grotesk), ui-sans-serif, system-ui, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
For public-page hero headings, use approximately clamp(2.5rem, 5vw, 4.75rem),
weight 500, and slight negative tracking. Internal tools should remain denser.
Use a 4px base grid.
| Token | Value | Use |
|---|---|---|
space-1 | 4px | Tight icon/text alignment |
space-2 | 8px | Inline groups |
space-3 | 12px | Compact controls |
space-4 | 16px | Component padding |
space-6 | 24px | Related blocks |
space-8 | 32px | Page groups |
space-12 | 48px | Compact sections |
space-16 | 64px | Standard public sections |
space-24 | 96px | Large section rhythm |
space-32 | 128px | Editorial/hero separation |
The system may use one header announcement or one thin accent rule. It must occur once, at the top of the experience.
<header className="bg-white text-webcon-ink">
<div aria-hidden="true" className="h-1 w-full bg-webcon-accent" />
<nav className="mx-auto flex max-w-7xl items-center px-6 py-5">
{/* logo, navigation, utilities */}
</nav>
</header>
<main>{/* page */}</main>
<footer className="bg-webcon-ink px-6 py-16 text-white">
{/* no top border, no accent rule, no repeated announcement */}
</footer>
For systems such as GitLab that expose both a header and footer notice, configure the header notice only and leave the footer notice empty. Do not duplicate security or platform copy at both edges of every page.
<button class="bg-webcon-primary px-6 py-3 font-semibold text-white transition-colors hover:bg-webcon-primary-dark focus-visible:outline focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-webcon-primary-dark">
Primary action
</button>
<button class="bg-neutral-100 px-6 py-3 font-semibold text-webcon-ink transition-colors hover:bg-webcon-primary-pale focus-visible:outline focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-webcon-primary-dark">
Secondary action
</button>
<button class="bg-transparent px-4 py-2 font-semibold text-webcon-muted hover:bg-neutral-100 hover:text-webcon-primary-dark focus-visible:outline focus-visible:outline-3 focus-visible:outline-offset-2 focus-visible:outline-webcon-primary-dark">
Ghost action
</button>
All buttons are border-0 rounded-none shadow-none. A subtle shadow is acceptable
for the single primary action when it needs elevation from a busy background.
bg-neutral-100 border-0 rounded-none for light inputs.accent-color: #1b7a95.#f8fafb zebra rows; use pale teal for hover and selection.bg-white or bg-webcon-primary-pale with padding.Project icons must represent the project, not the category chosen by the interface.
Use this source order:
SVG, web manifest, Apple touch icon, then PNG/ICO).Rules:
object-fit: contain and 12-16% safe space.Favicon resolution must use the page metadata or web manifest when possible. Do not default to a third-party favicon proxy when the project site can supply its own asset.
Use the project MDX components instead of raw HTML when a component exists.
<Tabs defaultValue="v14">
<TabsList>
<TabsTrigger value="v14">TYPO3 v14</TabsTrigger>
</TabsList>
<TabsContent value="v14">Content for TYPO3 v14...</TabsContent>
</Tabs>
<ComparisonTable
headers={['Feature', 'TYPO3 v14']}
rows={[
{ label: 'Content Blocks 2.x', values: [true] },
{ label: 'Symfony 7.4', values: [true] },
]}
/>
<Callout type="info" title="Best Practice">
Use a filled semantic surface without a border.
</Callout>
<MDXImage
src="/images/architecture-diagram.png"
alt="TYPO3 extension architecture"
caption="Figure 1: Domain-driven TYPO3 architecture"
/>
Implement these components with square, borderless surfaces even if an upstream component ships with a border or radius.
Keep semantic graph edges, but remove decorative node and cluster strokes.
%%{init: {'theme': 'base', 'themeVariables': {
'primaryColor': '#1b7a95',
'primaryTextColor': '#ffffff',
'primaryBorderColor': '#1b7a95',
'lineColor': '#5e6870',
'secondaryColor': '#e8f4f8',
'tertiaryColor': '#f5f8f9',
'clusterBorder': '#f5f8f9',
'edgeLabelBackground': '#ffffff'
}}}%%
graph TD
A[Client request] --> B[TYPO3]
B --> C[Response]
Apply rx: 0, ry: 0, and stroke-width: 0 to rectangular nodes and clusters.
Do not remove arrows and relationship lines; they carry information.
:focus-visible with a 3px high-contrast outline and 2px offset.tabindex.alt="" for decorative images.| Breakpoint | Width | Tailwind |
|---|---|---|
| Mobile | < 640px | default |
| Tablet | >= 640px | sm: |
| Desktop | >= 1024px | lg: |
| Wide | >= 1280px | xl: |
Reduce columns before reducing readable type. Preserve surface hierarchy and avoid turning each mobile item into a rounded bordered card.
Dark mode keeps the same square, borderless hierarchy. Use near-black/navy canvases, slightly lighter work surfaces, light cyan for interactive emphasis, and light text. Do not reveal structure by adding borders that do not exist in light mode.
Map semantic tokens, then remove the default card treatment:
:root {
--radius: 0rem;
--background: 195 20% 97%;
--foreground: 210 11% 10%;
--primary: 193 69% 35%;
--primary-foreground: 0 0% 100%;
--muted: 195 17% 94%;
--accent: 195 61% 94%;
--ring: 193 69% 27%;
}
rounded-none border-0 shadow-none to cards, buttons, fields, tabs, and callouts.Before shipping, verify:
npx claudepluginhub dirnbauer/webconsulting-skillsDesigns distinctive, non-generic web UIs using a strategy-first approach: define brand identity, typography, color system, then craft layout, components, motion, and accessibility. Activates on build/design requests to avoid AI-default aesthetics.
Generates BRAND-IDENTITY.md file defining colors, typography, spacing, components, accessibility, and responsive design for project roots. Guides via discovery questions or uses user-provided tokens.
Provides UI/UX design guidance for unique, accessible web interfaces covering colors, typography, layouts. Always asks before decisions; activates for building web components, pages, apps.