--gl-text-color-disabled fails text-contrast, so if content/context need to be visually perceivable then it should not be disabled.
Dimmed: Rendering a 'dimmed' Menu Item ensures the Menu Item is still discoverable and can receive focus, but the Menu Item cannot not be activated by the user.
Disabled: Consider using a 'dimmed' Menu Item. Disabling Menu Items creates barriers for all users and can exclude people with disabilities.
The GlDropdownItem component does not have a dimmed prop. It currently supports:
isChecked / isCheckItem for check statesdisabled (inherited from Bootstrap Vue via $attrs)Disabled removes the element from the a11y tree and would not be available to screen-readers, so any help text or tooltip content is lost.
Add dimmed menu item functionality:
dimmed prop to GlDropdownItem that applies a CSS class for visual styling (reduced opacity, grayed out)disabled attribute (which removes from tab order)[Decision]
Based on this two day exploration I do not recommend we look to implement and maintain a Figma Make template, unless there's enough demand across GitLab for Make vs other rapid prototyping options
Day 2 update — validation complete:
Overall: 3 out of 4 validated. The workflow is viable.
Picked up from Day 1's finding that the guideline-based workflow was viable but token fidelity was the remaining gap. Here's where each question landed:
@gitlab/ui ships its compiled token CSS as part of the npm package and Vite can import it directly:
@import '@gitlab/ui/src/tokens/build/css/tokens.css';
All --gl-* custom properties are live in Make and stay in sync automatically when @gitlab/ui is upgraded. No separate file to maintain.
button.md was generated with Claude using @gitlab/ui source and Pajamas docs as context, then validated and refined over two days in Make. Auditing against the real SCSS source and live Pajamas docs caught several spec gaps — border radius, font weight, icon size, selected state color. All corrected. Added a global rule to Guidelines.md enforcing var(--gl-*) token usage on every component Make generates going forward.
https://gitlab-org.gitlab.io/frontend/fonts/ and the @gitlab/fonts npm package is installable. The issue is Figma Make's preview sandbox — it blocks external network requests, so @font-face rules pointing to the canonical URL never load. This is a Make environment constraint worth raising directly with Figma. The fix is on their end, not ours.
The core problem is Vue → React and it doesn't go away.
1. Request Vue support in Figma Make The real fix. Eliminates the translation layer entirely. Worth raising directly with Figma as a design system use case, GitLab is likely not the only company in this position.
2. CI-coupled guideline maintenance A script that regenerates component.md files from @gitlab/ui source on each release, with a CI process that flags stale guidelines when component source changes. The most realistic near-term option but requires dedicated ownership to stay healthy.
3. @gitlab/ui-react wrapper package A proper React implementation of Pajamas components that Make could import directly, the same way it handles shadcn today. Every component would have the same prop API as @gitlab/ui and use the same --gl-* token chain we validated this week — meaning color, spacing, and typography changes flow through automatically. What's left to maintain manually is structural and behavioral changes, which are less frequent but more expensive to translate.
The maintenance cost is real and every component change in the Vue library needs a corresponding change in the React library. It's a parallel implementation to maintain indefinitely. It only makes sense if there's enough demand across GitLab for Make, other React-based tooling, third-party integrations to justify the investment. If that demand exists, it's the most durable path. If it doesn't, it's the same maintenance cost as today with more formality around it.
Day 1
Did some initial exploration on this. Since Make only supports React and @gitlab/ui is Vue, direct package import isn't an option — but I found a viable workflow:
@gitlab/ui as a reference-only package in Make (readable source, no Vue imports)@gitlab/ui source, and design tokensTested end-to-end with Button. From a clean Make file with just a Guidelines.md and a generated button.md, Make produced a standalone GlButton — no shadcn dependency, correct prop API, contextual design tokens (--gl-button-*) with hex fallbacks, and proper a11y (double focus ring, aria-disabled loading, aria-pressed toggle). Side-by-side visual comparison against the docs caught remaining color issues in the category model that still need correction.
Removed "project" from the screen-reader text as it didn't make sense to keep for the contexts where you are not at the project level.
Create a repeatable, low-effort content template that aggregates Pajamas Design System changes into a centralized digest distributed via The Loop on a monthly cadence for ICs, and a quarterly rollup for design/engineering leadership and C-suite.
This addresses a clear gap: there is no single place for consumers to go to understand what shipped, what changed in their Figma files, and what changed in code. Changes are currently scattered across three sources (UI Kit release notes, gitlab-ui changelog, design.gitlab.com changelog) with no curation layer on top.
| Source | What it tracks | Consumer relevance |
|---|---|---|
| UI Kit release notes | Figma component library changes | High for designers |
| gitlab-ui changelog | Coded component changes | High for engineers |
| design.gitlab.com changelog | Docs site changes | Low — only surface when guidance materially changes |
| Format | Cadence | Audience |
|---|---|---|
| Monthly digest | Monthly (aligned to milestone) | ICs — designers and engineers consuming Pajamas |
| Quarterly rollup | Quarterly | Engineering managers, design managers, directors/VPs, cross-functional stakeholders, C-suite |
Each issue covers one milestone and includes:
Curation rules:
deps: entries in changelogs — automated Renovate bumps, zero consumer impactDerived from the three monthly issues. Sections in priority order:
Phase 1 — Pilot (this milestone)
Phase 2 — Establish cadence
Phase 3 — Quarterly rollup
Phase 4 — Iterate
⚠️ GAI was used to create this draft automation outline
A scheduled CI pipeline runs on the last day of each milestone. It fetches and filters content from the gitlab-ui changelog and UI Kit release notes, then creates a pre-populated draft GitLab issue assigned to the curator DRI. The curator does one editorial pass (~15 min) and sends to The Loop.
What the pipeline does:
deps: entries (Renovate bumps, zero consumer impact)BREAKING CHANGES, feat:, and fix:
comms::draft
What the curator still does:
comms::draft to comms::ready when doneFuture levels:
#g_pajamas-design-system on draft creation + quarterly auto-generation from three monthly issues (~1–2 weeks additional effort)
⚠️ The draft script and pipeline config are directionally correct but should be treated as a conversation starter with ENG, not a ready-to-ship PR. Use them to align on approach before implementation.
Prerequisites:
api scopeSteps:
digest.js to the root of the DS repogenerate-monthly-digest job to the existing .gitlab-ci.yml
GITLAB_TOKEN — access token with api scopeGITLAB_PROJECT_ID — numeric ID of this projectCURATOR_USERNAME — GitLab username to assign the draft issue toQuestions to validate with ENG before implementing:
node:20-alpine the right runner image, or does CI use a different environment?CURATOR_USERNAME be static or pulled dynamically from a rotation list?Adam Ferch (0d1da5b7) at 27 Feb 19:05
Removes 'for this project' screen-reader content.
Adam Ferch (ba2d24c2) at 27 Feb 16:07
Removes aria-hidden test
Adam Ferch (1ab6f0e0) at 26 Feb 23:24
Removes aria-hidden
Supplementing the existing link text felt like the right move rather than going down the heading route the issue caught. A Small fix that didn't require design and adds clear context to the link and page.
In the future we could look to include the author and time stamp additionally so you'd get something like: [commit string] most recent commit in this project authored by [name] [time-stamp]