Outils pour développeurs · Nouvelle ressource

Système de design GitLab Pajamas.

Un guide Pajamas pour les flux de travail techniques : véritables jetons sémantiques, typographie et espacement fluides, inspecteur de pipeline par étapes, affichage lisible des erreurs et simulation explicite d’une nouvelle tentative locale.

Guide OpenDesign8 chapitres43 entrées de référenceGuide de l’application d’origine
01

Aperçu de l’interface du système de design GitLab Pajamas

Filtrez les tâches par état, sélectionnez une tâche pour consulter sa sortie, simulez la réussite de la vérification du lien en échec, puis réinitialisez les données de test d’origine.

Examiner l’échec d’un pipeline et simuler la repriseOuvrir l’exemple complet
@gitlab/ui 138.0.0 natif CSS ; mise en page originale des étapes, HTML et logique d’état locale. Aucune activité CI réelle. · Référence de mise en œuvre
02

Référence de conception du système de design GitLab Pajamas

Export publié des jetons clairs de @gitlab/ui 138.0.0 et CSS natif. Les noms GL_* sont des exports JavaScript ; leurs équivalents en minuscules --gl-* figurent dans le CSS compilé. L’exemple utilise la feuille de style native avec HTML et la logique d’état d’origine, et non des composants Vue montés.

Surfaces, textes et bordures sémantiques

Source
Nom / règleValeur / configurationUtilisation
GL_BACKGROUND_COLOR_DEFAULT#fffUtilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_BACKGROUND_COLOR_SUBTLE#f7f7f5 Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_BACKGROUND_COLOR_STRONG#ecebea Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_TEXT_COLOR_DEFAULT#3a383d Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_TEXT_COLOR_SUBTLE#646163 Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_TEXT_COLOR_STRONG#18171d Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_TEXT_COLOR_HEADING#18171d Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_TEXT_COLOR_LINK#27599f Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_BORDER_COLOR_DEFAULT#dcdbd9 Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_BORDER_COLOR_SUBTLE#ecebea Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.
GL_BORDER_COLOR_STRONG#c1bfbe Utilisez le rôle indiqué par le jeton ; il s’agit de l’export de référence clair.

Espacement de l’interface

Source
Nom / règleValeur / configurationUtilisation
GL_SPACING_SCALE_00pxLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_10.125remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_20.25remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_30.5remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_40.75remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_51remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_61.5remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_72remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_82.5remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.
GL_SPACING_SCALE_93remLes valeurs de l’échelle d’espacement ne correspondent pas à leur indice multiplié par une constante unique.

Échelle typographique adaptative

Source
Nom / règleValeur / configurationUtilisation
GL_FONT_SIZE_1000.75remLes rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_2000.8125remLes rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_3000.875remLes rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_4001remLes rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_500clamp(1.125rem, 0.9027777778rem + 0.462962963vw, 1.25rem)Les rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_600clamp(1.3125rem, 0.8680555556rem + 0.9259259259vw, 1.5625rem)Les rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_700clamp(1.5rem, 0.8333333333rem + 1.3888888889vw, 1.875rem)Les rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.
GL_FONT_SIZE_800clamp(1.75rem, 0.8611111111rem + 1.8518518519vw, 2.25rem)Les rôles de plus grande taille utilisent clamp ; conservez l’expression lorsque la typographie fluide est souhaitée.

Rayons des commandes et des surfaces

Source
Nom / règleValeur / configurationUtilisation
GL_BORDER_RADIUS_NONE0pxLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_XS1pxLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_SM0.125remLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_MD0.25remLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_LG0.5remLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_XL0.75remLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_FULL9999pxLe rayon définit la forme du composant, et non l’importance de l’action.
GL_BORDER_RADIUS_DEFAULT0.25remLe rayon définit la forme du composant, et non l’importance de l’action.

Références des couleurs d’état

Source
Nom / règleValeur / configurationUtilisation
GL_COLOR_GREEN_50#e6f5ea Surface discrète pour un état de réussite.
GL_COLOR_GREEN_800#075048 Couleur de premier plan de l’état de réussite sur sa surface claire.
GL_COLOR_RED_50#feeef0 Surface discrète pour un état d’échec.
GL_COLOR_RED_800#891c2f Couleur de premier plan de l’état d’échec sur sa surface claire.
GL_COLOR_BLUE_50#e8f2fd Surface de la tâche sélectionnée.
GL_COLOR_BLUE_700#27599f Référence de la bordure de sélection et de l’indicateur de focus visible.
03

Guide complet du système de design GitLab Pajamas

Un guide pratique pour choisir, appliquer et évaluer ce système dans une interface réelle.

DESIGN-gitlab-pajamas.md

Des conseils complets, un point de départ pour la mise en œuvre et des liens vers les sources.

Télécharger le guide

Architecture de l’information du pipeline du système de design GitLab Pajamas

Présentez le contexte de l’échec avant les options de reprise

L’en-tête indique un pipeline, une branche et un commit fictifs pour contextualiser le panneau d’inspection des tâches. Les regroupements Build, Test et Publish sont visibles, et la sélection d’une tâche ouvre sa sortie. Pour la vérification de lien en échec, indiquez le chemin et la condition de sortie qui expliquent l’échec avant de proposer une nouvelle tentative.

Extrait de ce guide OpenDesign

Préservez la lisibilité d’un graphe compact

Cet exemple utilise des colonnes par étape et des boutons, sans prétendre mettre en œuvre un graphe de dépendances complet. Sur un écran étroit, les étapes s’empilent dans l’ordre du document. Un pipeline de production peut nécessiter des tâches parallèles, des dépendances, ainsi que des états d’attente, manuels ou annulés ; ceux-ci doivent être modélisés explicitement plutôt que déduits des trois titres d’exemple.

Couleurs sémantiques et états du système de design GitLab Pajamas

Utilisez des rôles d’interface sémantiques pour la surface de travail

L’export clair propose des surfaces neutres chaudes, des niveaux de contraste distincts pour les textes et des bordures discrètes. L’exemple utilise la surface par défaut pour les cartes des tâches, une surface bleue pour la sélection et une zone de journal sombre. Le guide indique les valeurs exactes du package afin de reproduire ces relations sans prélever les couleurs d’une capture d’écran.

Donnez du sens aux libellés d’état

Les mots Réussie et Échec figurent dans chaque ligne de tâche et chaque badge. Une coche ou une croix complète ce texte ; des badges colorés seuls seraient ambigus. Le violet de la marque n’est pas utilisé comme indicateur générique de réussite. Les références d’état du tableau sont volontairement distinctes du bleu de sélection.

Échelle typographique et texte technique du système de design GitLab Pajamas

Conservez les expressions fluides lorsqu’elles s’appliquent

Le package expose des rôles de petite taille fixes et des rôles de plus grande taille basés sur clamp. Remplacer un clamp par sa valeur maximale modifie le comportement adaptatif. L’exemple d’origine utilise un titre de 24px à l’échelle de l’application et des rôles secondaires compacts de 12–14px ; ces choix sont présentés comme des décisions de mise en page, et non comme des jetons supplémentaires du package.

Utilisez une police à chasse fixe pour les identifiants et les sorties

La branche et le commit sont présentés en style code, tandis que les noms des tâches restent lisibles dans l’interface. La sortie apparaît dans un bloc à chasse fixe avec retour à la ligne et cible de focus clavier. Les chemins longs peuvent revenir à la ligne au lieu d’élargir toute la page au-delà de la largeur d’un téléphone. Lorsqu’une autre tâche est sélectionnée, le texte est remplacé plutôt que d’injecter du HTML brut.

Espacement et rythme des bordures du système de design GitLab Pajamas

Ne calculez pas les valeurs des jetons à partir de leur indice

GL_SPACING_SCALE_3 vaut 0.5rem et scale_5 vaut 1rem ; l’indice est une clé, pas un multiplicateur direct. Utilisez la valeur exportée lors de l’implémentation de l’échelle. Le tableau de référence conserve les unités exactes, y compris le pas de zéro pixel.

Utilisez les séparations pour clarifier les zones

Sélection et filtrage des tâches du système de design GitLab Pajamas

Dissociez l’identité de la tâche sélectionnée de sa position dans le filtre

Le script utilise des identifiants textuels stables comme links et accessibility. Le filtre détermine les tâches affichées et sélectionne une tâche correspondante, s’il y en a une. Un clic sur une tâche met à jour ensemble son état enfoncé, son étape, son badge d’état et son journal. Cela évite d’afficher le titre d’une tâche avec la sortie d’une autre.

Conservez le contexte de reprise lorsque le résultat disparaît

Une fois la tâche échouée simulée comme réussie, le filtre « Tâches échouées » ne renvoie aucun résultat. Le message d’état vide explique comment rétablir la liste, tandis que l’inspecteur conserve le résultat qui vient d’être obtenu. Ce choix délibéré permet à l’utilisateur de comprendre pourquoi la ligne a disparu, sans perdre la confirmation.

Système de design GitLab Pajamas : relancer et réinitialiser

Présentez clairement la simulation

L’action indique « Simuler une relance réussie », modifie uniquement les données locales de démonstration et remplace le journal par le résultat écrit d’une simulation. Elle ne met pas de tâche en file d’attente, ne crée pas de tâche et n’inspecte aucun dépôt. Le badge global du pipeline est recalculé à partir de l’état de toutes les tâches, au lieu de passer aveuglément à « Réussi » après un clic.

Rétablissez les données initiales complètes

La réinitialisation crée une nouvelle copie des données initiales des tâches, sélectionne la tâche de liaison en échec, rétablit le filtre « Toutes les tâches » et affiche à nouveau les deux panneaux. Elle efface le résultat simulé sans recharger la page. L’exemple peut ainsi être reproduit, et les personnes qui le consultent ensuite ne risquent pas de prendre une réussite simulée antérieure pour l’état initial.

  1. Sélectionnez « Tâches échouées » et consultez la route en échec.
  2. Simulez la réussite et consultez l’inspecteur qui conserve le résultat ainsi que la liste filtrée vide.
  3. Réinitialisez l’exemple et vérifiez que l’échec et la sortie d’origine sont rétablis.

Système de design GitLab Pajamas : commandes de tâches accessibles

Utilisez des boutons pour la sélection locale

Chaque tâche est un véritable bouton doté de aria-pressed. Son état est indiqué à côté de sa durée, et l’indicateur de focus visible au clavier reste distinct de son apparence lorsqu’elle est sélectionnée. Le filtre possède une étiquette visible. Aucune navigation graphique personnalisée réservée au clavier n’est revendiquée pour ces commandes simples.

Annoncez le résultat sans déplacer le focus

Le résultat est annoncé dans une région d’état après une relance ou une réinitialisation. Le journal contient du texte sélectionnable et peut recevoir le focus clavier pour être lu, mais l’application ne lui transfère pas automatiquement le focus après chaque sélection. Les comparaisons répétées entre les tâches restent ainsi prévisibles.

Système de design GitLab Pajamas : CSS et limites de l’intégration Vue

Choisissez explicitement un niveau d’intégration

Ce code source importe la distribution publiée de CSS et fournit un comportement original en HTML/JavaScript. Il n’instancie ni GlButton, ni GlFormSelect, ni aucun autre export Vue. Une application Vue doit utiliser les composants natifs correspondants et leurs props/événements actuels, plutôt que de considérer cette implémentation DOM comme un exemple Vue.

  • Distribution de CSS : apparence native et variables sémantiques.
  • HTML d’origine : commandes accessibles et structure des régions.
  • JavaScript d’origine : données de démonstration, sélection, filtres et simulation.

Associez les jetons à la version importée

Système de design GitLab Pajamas : exemples de composants

index.html — espace de travail du pipeline

Mise en page sémantique et commandes complètes.

html
<!doctype html>
<html lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Pipeline specimen</title>
<body>
<main class="pipeline-example">
  <header>
    <p class="eyebrow">sample-team / documentation</p>
    <div class="title-row">
      <div>
        <h1>Pipeline #1842</h1>
        <p>
          Preview build for <code>docs/update-navigation</code> ·
          <code>7c31a82</code>
        </p>
      </div>
      <span id="pipeline-state" class="state failed">Failed</span>
    </div>
  </header>
  <div class="toolbar">
    <label for="job-filter">Show jobs</label
    ><select id="job-filter" class="gl-form-select">
      <option value="all">All jobs</option>
      <option value="failed">Failed jobs</option>
      <option value="passed">Passed jobs</option></select
    ><button id="reset" class="btn btn-default gl-button">
      Reset specimen
    </button>
  </div>
  <div class="pipeline-layout">
    <section aria-label="Pipeline stages">
      <div id="stages" class="stages"></div>
      <p id="empty" hidden>
        No jobs match this filter. Choose All jobs to restore the pipeline.
      </p>
    </section>
    <section class="job-detail" aria-labelledby="job-title">
      <div class="detail-heading">
        <h2 id="job-title"></h2>
        <span id="job-state" class="state"></span>
      </div>
      <dl>
        <dt>Stage</dt>
        <dd id="job-stage"></dd>
        <dt>Runner</dt>
        <dd>local-example-runner</dd>
        <dt>Execution</dt>
        <dd>Simulated in this page</dd>
      </dl>
      <h3>Job output</h3>
      <pre id="job-log" tabindex="0" aria-label="Selected job output"></pre>
      <button id="retry" class="btn btn-confirm gl-button">
        Simulate successful retry
      </button>
      <p id="feedback" role="status"></p>
    </section>
  </div>
  <footer>
    Native @gitlab/ui 138.0.0 CSS with original HTML and state logic. Fictional
    pipeline; no runner, repository or CI job is started.
  </footer>
</main>

<script type="module" src="/src/main.js"></script>
</body></html>

Référence du code

  • Enregistrez à la racine du projet Vite.

main.js — données de démonstration et logique de reprise

Import natif de CSS et comportement complet des tâches par étape.

js
import "@gitlab/ui/dist/index.css";
import "./pajamas.css";
const initial = [
  {
    id: "lint",
    stage: "Build",
    state: "passed",
    time: "12s",
    log: "$ npm run lint\nNo lint errors.\nJob succeeded.",
  },
  {
    id: "bundle",
    stage: "Build",
    state: "passed",
    time: "31s",
    log: "$ npm run build\nStatic assets generated.\nJob succeeded.",
  },
  {
    id: "links",
    stage: "Test",
    state: "failed",
    time: "18s",
    log: "$ npm run check:links\n/docs/old-navigation returned 404\n1 broken internal link.\nJob failed: exit code 1.",
  },
  {
    id: "accessibility",
    stage: "Test",
    state: "passed",
    time: "24s",
    log: "$ npm run check:a11y\nExample fixture checks passed.\nJob succeeded.",
  },
  {
    id: "preview",
    stage: "Publish",
    state: "passed",
    time: "9s",
    log: "$ npm run package:preview\nLocal preview archive generated.\nJob succeeded.",
  },
];
let jobs = structuredClone(initial),
  selected = "links";
const filter = document.querySelector("#job-filter"),
  stages = document.querySelector("#stages"),
  retry = document.querySelector("#retry"),
  feedback = document.querySelector("#feedback");
function render() {
  stages.replaceChildren();
  let count = 0;
  for (const name of ["Build", "Test", "Publish"]) {
    const matches = jobs.filter(
      (j) =>
        j.stage === name &&
        (filter.value === "all" || j.state === filter.value),
    );
    if (!matches.length) continue;
    const section = document.createElement("div");
    section.className = "stage";
    const h = document.createElement("h2");
    h.textContent = name;
    section.append(h);
    for (const j of matches) {
      count++;
      const b = document.createElement("button");
      b.type = "button";
      b.className = "job";
      b.setAttribute("aria-pressed", String(j.id === selected));
      const strong = document.createElement("strong"),
        small = document.createElement("small");
      strong.textContent = j.id;
      small.textContent =
        (j.state === "passed" ? "✓ Passed" : "× Failed") + " · " + j.time;
      b.append(strong, small);
      b.onclick = () => {
        selected = j.id;
        feedback.textContent = "";
        render();
      };
      section.append(b);
    }
    stages.append(section);
  }
  document.querySelector("#empty").hidden = count !== 0;
  const j = jobs.find((j) => j.id === selected);
  document.querySelector("#job-title").textContent = j.id;
  document.querySelector("#job-stage").textContent = j.stage;
  document.querySelector("#job-log").textContent = j.log;
  const state = document.querySelector("#job-state");
  state.className = "state " + j.state;
  state.textContent = j.state === "passed" ? "Passed" : "Failed";
  retry.hidden = j.state !== "failed";
  const failed = jobs.some((j) => j.state === "failed"),
    overall = document.querySelector("#pipeline-state");
  overall.textContent = failed ? "Failed" : "Passed";
  overall.className = "state " + (failed ? "failed" : "passed");
}
filter.onchange = () => {
  const match = jobs.find(
    (j) => filter.value === "all" || j.state === filter.value,
  );
  if (match) selected = match.id;
  feedback.textContent = "";
  render();
};
retry.onclick = () => {
  const j = jobs.find((j) => j.id === selected);
  j.state = "passed";
  j.time = "15s";
  j.log =
    "$ npm run check:links\nSimulation: updated route found.\nNo broken internal links.\nJob succeeded (local simulation).";
  render();
  feedback.textContent =
    "Simulated retry completed locally. No CI job was started.";
};
document.querySelector("#reset").onclick = () => {
  jobs = structuredClone(initial);
  selected = "links";
  filter.value = "all";
  feedback.textContent = "Specimen restored.";
  render();
};
render();

Référence du code

  • Enregistrez sous src/main.js. Aucune requête CI n’est effectuée.

pajamas.css — composition d’origine

Étapes adaptatives, cartes sélectionnées, métadonnées et sortie du journal avec retour à la ligne.

css
[hidden] {
  display: none !important;
}
* {
  box-sizing: border-box;
}
body {
  margin: 0;
  font-family: Arial, sans-serif;
  font-size: 14px;
  color: var(--gl-text-color-default, #3a383d);
  background: var(--gl-background-color-default, #fff);
}
.pipeline-example {
  padding: 28px;
}
.pipeline-example header {
  padding-bottom: 20px;
  border-bottom: 1px solid var(--gl-border-color-default);
}
.eyebrow {
  font-size: 12px;
  color: var(--gl-text-color-subtle);
  margin-bottom: 16px;
}
.title-row {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  align-items: flex-start;
}
h1 {
  font-size: 24px;
  font-weight: 600;
  margin: 0 0 8px;
}
h2 {
  font-size: 18px;
  font-weight: 600;
  margin: 0;
}
h3 {
  font-size: 14px;
  font-weight: 600;
}
.title-row p {
  margin: 0;
  color: var(--gl-text-color-subtle);
}
code {
  font: 12px monospace;
  background: #f7f7f5;
  color: #3a383d;
  padding: 2px 4px;
  overflow-wrap: anywhere;
}
.toolbar {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 20px 0;
}
.toolbar label {
  margin: 0;
  font-weight: 600;
}
.toolbar select {
  max-width: 180px;
}
.toolbar button {
  margin-left: auto;
}
.pipeline-layout {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(300px, 1fr);
  gap: 24px;
}
.stages {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
}
.stage h2 {
  font-size: 13px;
  margin-bottom: 12px;
  color: var(--gl-text-color-subtle);
}
.job {
  display: block;
  width: 100%;
  text-align: left;
  background: #fff;
  border: 1px solid var(--gl-border-color-default);
  border-radius: 4px;
  padding: 12px;
  margin-bottom: 8px;
  color: inherit;
  font: inherit;
  cursor: pointer;
}
.job[aria-pressed="true"] {
  border-color: #27599f;
  box-shadow: inset 0 0 0 1px #27599f;
  background: #e8f2fd;
}
.job strong {
  display: block;
  font-size: 13px;
  overflow-wrap: anywhere;
}
.job small {
  display: block;
  margin-top: 6px;
  color: var(--gl-text-color-subtle);
}
.job-detail {
  border: 1px solid var(--gl-border-color-default);
  border-radius: 4px;
  padding: 20px;
  min-width: 0;
}
.detail-heading {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  align-items: center;
}
.state {
  font-size: 12px;
  font-weight: 600;
  border-radius: 9999px;
  padding: 3px 9px;
  white-space: nowrap;
}
.state.failed {
  background: #feeef0;
  color: #891c2f;
}
.state.passed {
  background: #e6f5ea;
  color: #075048;
}
dl {
  display: grid;
  grid-template-columns: 90px minmax(0, 1fr);
  gap: 8px;
  margin: 20px 0;
  font-size: 12px;
}
dt {
  color: var(--gl-text-color-subtle);
  font-weight: 400;
}
dd {
  margin: 0;
  overflow-wrap: anywhere;
}
pre {
  background: #18171d;
  color: #ecebea;
  padding: 16px;
  border-radius: 4px;
  font: 12px/1.7 monospace;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  min-height: 160px;
  margin-bottom: 16px;
}
#feedback {
  font-size: 12px;
  margin: 12px 0 0;
}
footer {
  margin-top: 28px;
  padding-top: 16px;
  border-top: 1px solid var(--gl-border-color-subtle);
  font-size: 12px;
  color: var(--gl-text-color-subtle);
}
button:focus-visible,
select:focus-visible,
pre:focus-visible {
  outline: 2px solid #27599f;
  outline-offset: 3px;
}
@media (max-width: 1050px) {
  .pipeline-layout {
    grid-template-columns: 1fr;
  }
  .stages {
    gap: 16px;
  }
}
@media (max-width: 550px) {
  .pipeline-example {
    padding: 16px;
  }
  .toolbar {
    flex-wrap: wrap;
  }
  .toolbar button {
    margin-left: 0;
  }
  .stages {
    grid-template-columns: 1fr;
  }
  .stage {
    border-bottom: 1px solid var(--gl-border-color-subtle);
    padding-bottom: 8px;
  }
  .title-row {
    flex-wrap: wrap;
  }
  .job-detail {
    padding: 16px;
  }
}

Référence du code

  • Enregistrez sous src/pajamas.css. La police système de remplacement est explicitement définie ; aucune police de marque GitLab n’est fournie.
04

Système de design GitLab Pajamas : configuration de l’agent

Point de départ de l’implémentation

Cette intégration importe uniquement la distribution native de CSS. Si vous adoptez les composants Vue de GitLab UI, respectez séparément les exigences de dépendances homologues de GitLab UI.

sh
npm create vite@latest pajamas-pipeline -- --template vanilla
cd pajamas-pipeline
npm install
npm install @gitlab/[email protected]
# Replace index.html; add src/main.js and src/pajamas.css from the complete examples.
npm run dev

Un prompt pour votre projet

Prompt pour l’agent IA
Créez un inspecteur technique de tâches à l’aide des surfaces sémantiques de Pajamas, de références réelles d’espacement et de typographie, d’identifiants de tâche stables et d’une sélection accessible. Utilisez l’intégralité du code source des données de démonstration, conservez le contexte visible de l’échec, rendez les états vides après filtrage compréhensibles et indiquez clairement toute simulation locale. Ne laissez pas entendre que CSS ou l’exemple de relance crée une tâche GitLab CI.
05

Système de design GitLab Pajamas : sources et périmètre

Guide d’application OpenDesign pour GitLab Pajamas et @gitlab/ui 138.0.0. Le package natif CSS met en forme cet exemple original en HTML/JavaScript. Le pipeline est fictif et aucun API GitLab, environnement d’exécution Vue, exécuteur CI ou opération sur un dépôt n’est invoqué.