一键导入
comtech-ui-design
Design system, visual language, tone, and UI conventions for comtechconsulting.dk — reference before adding any new UI, copy, or page to the site.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Design system, visual language, tone, and UI conventions for comtechconsulting.dk — reference before adding any new UI, copy, or page to the site.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
Apply senior UI/UX judgment to interfaces, user flows, interaction details, and product usability decisions.
Build, review, and extend Astro static sites — config, integrations, SEO, deployment to GitHub Pages.
Apply senior-level engineering judgment to code review, implementation, debugging, refactoring, and delivery planning.
Advise on Confluence Cloud AI — Atlassian Intelligence, Rovo Chat, Rovo Chat macro, plan tier detection, and space-level AI scoping.
Configure and surface Rovo AI features in Confluence Cloud — Chat, custom Agents, Space Agent assignment, and space homepage CTA patterns.
Bring a GitHub repo to professional standard — CI, security tooling, community health files, badges, Dependabot, CodeQL, and Scorecard.
基于 SOC 职业分类
| name | comtech-ui-design |
| description | Design system, visual language, tone, and UI conventions for comtechconsulting.dk — reference before adding any new UI, copy, or page to the site. |
| version | 3.1.0 |
| tags | ["comtech","ui","design-system","astro","brand"] |
| tool_agnostic | true |
| authors | ["Anders Hybertz"] |
Reference this skill before touching comtechconsulting.dk. Guiding principle: simplicity, cleanliness, consistency. Every inconsistency removed earns trust.
All quote-style text on the site — .hero-quote, .bento-pull, .blockquote-card, featured testimonial excerpts — must be upright (non-italic). Emphasis comes from border treatment, muted colour, and size, not from font-style.
font-style: italic was removed from all three elements in the May 2026 audit pass. If italic reappears on any quote class via a future patch, it is a regression.
The featured-card background gradient is a design token, not a hardcoded value:
--featured-bg: linear-gradient(135deg, #fafaff 0%, #f0f0ff 100%);
Both .bento-featured (global.css) and .svc-featured (services.astro) must reference var(--featured-bg). Any hardcoded #fafaff or #f0f0ff literal in source is a drift error — fix it.
| Token | Value |
|---|---|
| --bg | #f9f9f8 |
| --surface | #ffffff |
| --surface-2 | #f4f4f5 |
| --border | #e4e4e7 |
| --accent | #5352cc |
| --accent-hover | #4340b0 |
| --accent-text | #7c7bef |
| --accent-dim | rgba(83,82,204,0.08) |
| --text | #111112 |
| --text-2 | #52525b |
| --text-3 | #a1a1aa |
| --radius | 8px base — cards use calc(--radius * 1.5) = 12px |
| --max-w | 1100px |
| --nav-h | 64px |
Dark sections (hero, footer): --dark-bg #0d0d10 / --dark-surface #17171c / --dark-border #2a2a35 / --dark-text #f4f4f5
<tech> wordmark suffix..fade-up) — opacity only. No translateY, not even a small one. Y-axis movement is entrance theatrics regardless of magnitude.all 0.15s ease maximum.Three tiers, all sharing the same .btn base — identical height, padding (0.625rem 1.25rem), font-size. Never override these per-button.
Hierarchy rule: demote utility actions via opacity only — never by shrinking font or padding.
Sizing rule: when buttons in a group have unequal label lengths, set min-width so the shortest doesn't look stubby. Always pair with text-align: center; justify-content: center.
Mobile rule: stack vertically with align-items: stretch on the container — buttons fill equal full width. Do not use align-items: flex-start.
Three CTAs is one too many. A third hero CTA dilutes focus and competes with conversion. If a utility action is genuinely useful, move it lower on the page (e.g. bottom of About) and give it minimal visual weight — a secondary link, not a button.
Implementation: ChatGPT URL with injected structured prompt covering who Anders is, services, industries, credentials, contact. Opens new tab. Pure anchor, no backend.
Feature is sound — the prompt engineering is good, the utility is real. Disabled because the hero is the wrong placement. On a trust-led site, a CTA that sends the visitor to another product in another voice loses narrative control at the highest-stakes moment. The visitor gets their first real impression of COM through ChatGPT's output, not yours.
Rule: any feature that routes the user off-platform during initial evaluation competes with the site's authority. Keep it if it has a home lower on the page. Disable it rather than leave it in the hero.
public/llms.txt — structured site summary for AI crawlers. Keep current when services or contact details change.public/robots.txt — allow all, sitemap pointer.One rule, applied consistently everywhere: 1px solid var(--border) (#e4e4e7). This is already the value on nav, footer, .cta-strip, and .section-alt.
.section-alt for alternating background sections — it applies the border-top automatically..cta-strip border-top for the page-bottom CTA strip — already set in global.css.style="border-top: ..." on individual sections — put it in a class.style="background: ..." to vary section backgrounds — use .section-alt or a named modifier class.If two adjacent sections feel merged, the fix is not a colour or border change. It is usually better copy structure, stronger heading, or accepting that the sections belong together.
Anti-patterns caught in the wild:
Contact page channel hierarchy: Email is the primary channel — give it full card treatment. LinkedIn belongs in the same card, same layout class, not orphaned as a plain text link below. An orphaned "Also on LinkedIn" reads as an afterthought. Keeping both in the card structure gives LinkedIn appropriate context while email still reads first.
Home page deliberately surfaces three org voices: KPMG, Novo Nordisk, N3O. This is intentional — it signals breadth implicitly without claiming it. Do not consolidate to fewer orgs or swap quotes without raising it with Anders first. The Janus Tøth (Novo Nordisk) quote leads the featured section on the testimonials page — keep it there.
Anders prefers to be present from the first architectural decision through to production and value delivery — not parachute in, produce a document, and leave. This is a genuine differentiator from project-to-project advisory work and should be expressed on the about page.
Correct framing (from about.astro): "The preference is to be present from the first architectural decision through to production — and to see value delivered, not just handed over."
Danish tax authority examines one-person companies for signs of disguised employment. A professional web presence is direct evidence of genuine self-employment:
This informs content priorities:
Do not reduce client diversity on the home page or testimonials page for editorial tidiness. Three distinct org voices on the home page (KPMG, Novo, N3O) serve this purpose directly.
Challenge before building. This site should not accumulate features or drift in tone.
grill-me and interview Anders one question at a time.Bar: does this directly serve a potential client? "Maybe" or "nice touch" means push back.
npm run critique (or critique:fast to skip build). This captures 20 screenshots: every page × desktop + mobile × fold + full. The scroll simulation (20 steps, 120ms each, pause at bottom, 900ms settle before capture) ensures all IntersectionObserver animations fire. If deep sections appear blank, the scroll step count or delay may need increasing.Stage, don't ship. When the user has not explicitly asked for deployment, apply all changes to a local working branch and run critique:fast to show rendered screenshots for verification. Only push to main after explicit user sign-off. This is the default workflow — not an exception.
See astro-static-sites skill for the canonical critique.js template and the IntersectionObserver pitfall.
See references/nav-mobile-pitfalls.md for known mobile nav rendering issues and their fixes.
The .nav-links a[aria-current="page"] rule applies a background fill with border-radius. In the mobile dropdown, <a> elements are inline by default — their background box is not constrained to the row height, and with gap: 0.25rem the rounded fill visually bleeds into the adjacent item, making it look like two items are selected.
Fix (both lines required):
.nav-links li { display: block; }
.nav-links a { display: block; padding: 0.875rem 1rem; }
display: block on both <li> and <a> fully contains the background to the row. Vertical padding of 0.875rem gives the border-radius enough clearance from the item below. Do not go below 0.75rem — the bleed reappears.
Mobile nav active-state bleed: On mobile, the aria-current="page" background (--accent-dim) bleeds into the adjacent menu item because .nav-links a is not display: block inside the flex column. Fix: add display: block to both .nav-links li and .nav-links a in the mobile media query, and set vertical padding to at least 0.875rem so the border-radius can't visually bridge to the next item. Without display: block, the inline/flex anchor's background box is unconstrained and the rounded rect merges with the row below.
Nav z-index / scroll-offset overlap: The sticky nav overlaps content mid-page across multiple pages. Section anchors do not compensate for --nav-h (64px). Check that scroll-margin-top: var(--nav-h) is set on all scrollable sections.
Contact page interactivity: Email and LinkedIn entries must be real links — mailto: and href respectively. Plain text is a functional failure on a contact page. Add a visible CTA button ("Send an email →") with the mailto href.
About page: Always verify a CTA strip exists below the last content section. Removing it leaves a dead whitespace void before the footer.
Testimonials page: Only one card format should be used — the expanded card (italic quote, bold name, role below, "Read full recommendation +" link). Multiple competing formats read as errors. Duplicate testimonials across format variants must be removed.
Card height consistency: Two-column card rows need equal heights. Enforce with align-items: stretch on the grid container and height: 100% on cards if needed. Do not rely on copy length to balance heights naturally.
Page-lead width: .page-lead max-width is 68ch — not 52ch. Narrower values create an asymmetric gap between the intro paragraph and the full-width layout below it. Also set margin-bottom: 2rem so page headers breathe before grid content starts.
Single testimonial section: If only one quote is shown, ensure it earns the canvas — strong quote, credible attribution, appropriate label. "CLIENT PERSPECTIVE" (singular) reads oddly; prefer "What clients say" or omit the section label.
CTA strip visual differentiation: When a testimonial section and a CTA strip share a light background they can appear to merge. Do not attempt to fix this with colour — neither --surface-2 (too similar to --bg), --accent-dim (8% opacity, invisible at scale), nor a dark background (creates a heavy dark mass before the dark footer) solves it cleanly. The right answer: accept natural flow. A testimonial followed by a CTA is one thought — social proof into action. They are allowed to read as a continuation. Consistent 1px solid var(--border) hairlines via .section-alt and .cta-strip are sufficient. Do not add bespoke separators or background overrides for this transition.
Testimonials page format: Two formats are intentional — featured cards (expanded: italic quote + attribution) for primary testimonials, list rows for secondary ones. This reads as hierarchy, not inconsistency. Do not collapse to one format.
Footer wordmark hover: .footer .wordmark { color: var(--dark-text) } overrides the base colour with higher specificity, so the general a:hover { color: var(--accent) } rule never fires on the footer wordmark — the hover silently does nothing while the nav wordmark animates. Always add .footer .wordmark:hover { color: var(--accent); } as a companion rule. If you add any element-specific colour override that lives inside .footer or .dark-section, check whether a hover rule is needed at the same specificity level.