From a6d079e374e9c7d72956fefeca2ab1ae703fb946 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 10:33:14 +0000 Subject: [PATCH 1/5] Plan workshop UX simplification Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- docs/src/content/docs/agent-factory-status.mdx | 10 +++++----- docs/src/generated/workshop-content.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/src/content/docs/agent-factory-status.mdx b/docs/src/content/docs/agent-factory-status.mdx index 6d0c9f73414..3ff05ace683 100644 --- a/docs/src/content/docs/agent-factory-status.mdx +++ b/docs/src/content/docs/agent-factory-status.mdx @@ -23,7 +23,7 @@ These are experimental agentic workflows used by the GitHub Next team to learn, | [Archie](https://github.com/github/gh-aw/blob/main/.github/workflows/archie.md) | copilot | [![Archie](https://github.com/github/gh-aw/actions/workflows/archie.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/archie.lock.yml) | - | `/archie` | | [Architecture Guardian](https://github.com/github/gh-aw/blob/main/.github/workflows/architecture-guardian.md) | copilot | [![Architecture Guardian](https://github.com/github/gh-aw/actions/workflows/architecture-guardian.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/architecture-guardian.lock.yml) | - | - | | [Artifacts Usage Report](https://github.com/github/gh-aw/blob/main/.github/workflows/artifacts-summary.md) | copilot | [![Artifacts Usage Report](https://github.com/github/gh-aw/actions/workflows/artifacts-summary.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/artifacts-summary.lock.yml) | - | - | -| [Auto-Triage Issues](https://github.com/github/gh-aw/blob/main/.github/workflows/auto-triage-issues.md) | pi | [![Auto-Triage Issues](https://github.com/github/gh-aw/actions/workflows/auto-triage-issues.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/auto-triage-issues.lock.yml) | - | - | +| [Auto-Triage Issues](https://github.com/github/gh-aw/blob/main/.github/workflows/auto-triage-issues.md) | pi | [![Auto-Triage Issues](https://github.com/github/gh-aw/actions/workflows/auto-triage-issues.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/auto-triage-issues.lock.yml) | `11 */6 * * *` | - | | [Avenger](https://github.com/github/gh-aw/blob/main/.github/workflows/avenger.md) | claude | [![Avenger](https://github.com/github/gh-aw/actions/workflows/avenger.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/avenger.lock.yml) | `23 * * * *` | - | | [Basic Research Agent](https://github.com/github/gh-aw/blob/main/.github/workflows/research.md) | copilot | [![Basic Research Agent](https://github.com/github/gh-aw/actions/workflows/research.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/research.lock.yml) | - | - | | [Blog Auditor](https://github.com/github/gh-aw/blob/main/.github/workflows/blog-auditor.md) | claude | [![Blog Auditor](https://github.com/github/gh-aw/actions/workflows/blog-auditor.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/blog-auditor.lock.yml) | - | - | @@ -125,16 +125,16 @@ These are experimental agentic workflows used by the GitHub Next team to learn, | [Deployment Incident Monitor](https://github.com/github/gh-aw/blob/main/.github/workflows/deployment-incident-monitor.md) | copilot | [![Deployment Incident Monitor](https://github.com/github/gh-aw/actions/workflows/deployment-incident-monitor.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/deployment-incident-monitor.lock.yml) | - | - | | [Design Decision Gate 🏗️](https://github.com/github/gh-aw/blob/main/.github/workflows/design-decision-gate.md) | claude | [![Design Decision Gate 🏗️](https://github.com/github/gh-aw/actions/workflows/design-decision-gate.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/design-decision-gate.lock.yml) | - | - | | [Designer Drift Audit](https://github.com/github/gh-aw/blob/main/.github/workflows/designer-drift-audit.md) | copilot | [![Designer Drift Audit](https://github.com/github/gh-aw/actions/workflows/designer-drift-audit.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/designer-drift-audit.lock.yml) | - | - | -| [Detection Analysis Report](https://github.com/github/gh-aw/blob/main/.github/workflows/detection-analysis-report.md) | claude | [![Detection Analysis Report](https://github.com/github/gh-aw/actions/workflows/detection-analysis-report.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/detection-analysis-report.lock.yml) | - | - | +| [Detection Analysis Report](https://github.com/github/gh-aw/blob/main/.github/workflows/detection-analysis-report.md) | claude | [![Detection Analysis Report](https://github.com/github/gh-aw/actions/workflows/detection-analysis-report.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/detection-analysis-report.lock.yml) | `05 23 * * *` | - | | [Dev](https://github.com/github/gh-aw/blob/main/.github/workflows/dev.md) | codex | [![Dev](https://github.com/github/gh-aw/actions/workflows/dev.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dev.lock.yml) | `daily around 9:00` | - | | [Dev Hawk](https://github.com/github/gh-aw/blob/main/.github/workflows/dev-hawk.md) | copilot | [![Dev Hawk](https://github.com/github/gh-aw/actions/workflows/dev-hawk.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dev-hawk.lock.yml) | - | - | | [Developer Documentation Consolidator](https://github.com/github/gh-aw/blob/main/.github/workflows/developer-docs-consolidator.md) | claude | [![Developer Documentation Consolidator](https://github.com/github/gh-aw/actions/workflows/developer-docs-consolidator.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/developer-docs-consolidator.lock.yml) | - | - | | [Dictation Prompt Generator](https://github.com/github/gh-aw/blob/main/.github/workflows/dictation-prompt.md) | copilot | [![Dictation Prompt Generator](https://github.com/github/gh-aw/actions/workflows/dictation-prompt.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/dictation-prompt.lock.yml) | `weekly on sunday around 6:00` | - | | [Discussion Task Miner - Code Quality Improvement Agent](https://github.com/github/gh-aw/blob/main/.github/workflows/discussion-task-miner.md) | copilot | [![Discussion Task Miner - Code Quality Improvement Agent](https://github.com/github/gh-aw/actions/workflows/discussion-task-miner.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/discussion-task-miner.lock.yml) | - | - | | [Documentation Noob Tester](https://github.com/github/gh-aw/blob/main/.github/workflows/docs-noob-tester.md) | copilot | [![Documentation Noob Tester](https://github.com/github/gh-aw/actions/workflows/docs-noob-tester.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/docs-noob-tester.lock.yml) | - | - | -| [Documentation Unbloat](https://github.com/github/gh-aw/blob/main/.github/workflows/unbloat-docs.md) | pi | [![Documentation Unbloat](https://github.com/github/gh-aw/actions/workflows/unbloat-docs.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/unbloat-docs.lock.yml) | - | - | +| [Documentation Unbloat](https://github.com/github/gh-aw/blob/main/.github/workflows/unbloat-docs.md) | pi | [![Documentation Unbloat](https://github.com/github/gh-aw/actions/workflows/unbloat-docs.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/unbloat-docs.lock.yml) | `18 0 * * *` | - | | [Draft PR Cleanup](https://github.com/github/gh-aw/blob/main/.github/workflows/draft-pr-cleanup.md) | copilot | [![Draft PR Cleanup](https://github.com/github/gh-aw/actions/workflows/draft-pr-cleanup.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/draft-pr-cleanup.lock.yml) | - | - | -| [Duplicate Code Detector](https://github.com/github/gh-aw/blob/main/.github/workflows/duplicate-code-detector.md) | codex | [![Duplicate Code Detector](https://github.com/github/gh-aw/actions/workflows/duplicate-code-detector.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/duplicate-code-detector.lock.yml) | - | - | +| [Duplicate Code Detector](https://github.com/github/gh-aw/blob/main/.github/workflows/duplicate-code-detector.md) | codex | [![Duplicate Code Detector](https://github.com/github/gh-aw/actions/workflows/duplicate-code-detector.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/duplicate-code-detector.lock.yml) | `47 21 * * *` | - | | [ESLint Miner](https://github.com/github/gh-aw/blob/main/.github/workflows/eslint-miner.md) | copilot | [![ESLint Miner](https://github.com/github/gh-aw/actions/workflows/eslint-miner.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/eslint-miner.lock.yml) | - | - | | [ESLint Monster](https://github.com/github/gh-aw/blob/main/.github/workflows/eslint-monster.md) | pi | [![ESLint Monster](https://github.com/github/gh-aw/actions/workflows/eslint-monster.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/eslint-monster.lock.yml) | - | - | | [ESLint Refiner](https://github.com/github/gh-aw/blob/main/.github/workflows/eslint-refiner.md) | claude | [![ESLint Refiner](https://github.com/github/gh-aw/actions/workflows/eslint-refiner.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/eslint-refiner.lock.yml) | - | - | @@ -201,7 +201,7 @@ These are experimental agentic workflows used by the GitHub Next team to learn, | [Scout](https://github.com/github/gh-aw/blob/main/.github/workflows/scout.md) | claude | [![Scout](https://github.com/github/gh-aw/actions/workflows/scout.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/scout.lock.yml) | - | `/scout` | | [Security Compliance Campaign](https://github.com/github/gh-aw/blob/main/.github/workflows/security-compliance.md) | copilot | [![Security Compliance Campaign](https://github.com/github/gh-aw/actions/workflows/security-compliance.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/security-compliance.lock.yml) | - | - | | [Security Review Agent 🔒](https://github.com/github/gh-aw/blob/main/.github/workflows/security-review.md) | copilot | [![Security Review Agent 🔒](https://github.com/github/gh-aw/actions/workflows/security-review.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/security-review.lock.yml) | - | - | -| [Semantic Function Refactoring](https://github.com/github/gh-aw/blob/main/.github/workflows/semantic-function-refactor.md) | claude | [![Semantic Function Refactoring](https://github.com/github/gh-aw/actions/workflows/semantic-function-refactor.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/semantic-function-refactor.lock.yml) | - | - | +| [Semantic Function Refactoring](https://github.com/github/gh-aw/blob/main/.github/workflows/semantic-function-refactor.md) | claude | [![Semantic Function Refactoring](https://github.com/github/gh-aw/actions/workflows/semantic-function-refactor.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/semantic-function-refactor.lock.yml) | `17 2 * * *` | - | | [Sergo - Serena Go Expert](https://github.com/github/gh-aw/blob/main/.github/workflows/sergo.md) | claude | [![Sergo - Serena Go Expert](https://github.com/github/gh-aw/actions/workflows/sergo.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/sergo.lock.yml) | - | - | | [Sighthound Security Scan](https://github.com/github/gh-aw/blob/main/.github/workflows/sighthound-security-scan.md) | copilot | [![Sighthound Security Scan](https://github.com/github/gh-aw/actions/workflows/sighthound-security-scan.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/sighthound-security-scan.lock.yml) | - | - | | [Skillet](https://github.com/github/gh-aw/blob/main/.github/workflows/skillet.md) | copilot | [![Skillet](https://github.com/github/gh-aw/actions/workflows/skillet.lock.yml/badge.svg)](https://github.com/github/gh-aw/actions/workflows/skillet.lock.yml) | - | - | diff --git a/docs/src/generated/workshop-content.ts b/docs/src/generated/workshop-content.ts index f03ac7dc136..3cfac5d0055 100644 --- a/docs/src/generated/workshop-content.ts +++ b/docs/src/generated/workshop-content.ts @@ -1,5 +1,5 @@ // Generated by docs/scripts/sync-workshop-content.js -// Source: /tmp/workshop-source +// Source: https://github.com/githubnext/gh-aw-workshop/tree/main/workshop // Do not edit by hand. export const workshopSource = { From 4ecf123678ea6bc91364a04b4bcaf77b377977e9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 10:48:13 +0000 Subject: [PATCH 2/5] Simplify workshop experience styling Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../workshop/WorkshopExperience.astro | 159 +++--------------- docs/tests/workshop.spec.ts | 118 +++++++------ 2 files changed, 84 insertions(+), 193 deletions(-) diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index c25b42a9bde..5ca3361e918 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -485,22 +485,6 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ??
-
- {initialFlow.map((stepKey, index) => { - const step = workshopSteps.find((item) => item.key === stepKey); - if (!step) return null; - - return ( -
@@ -709,7 +693,6 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? const lessonPercent = root.querySelector('[data-workshop-lesson-percent]'); const lessonBar = root.querySelector('[data-workshop-lesson-bar]'); const lessonContext = root.querySelector('[data-workshop-lesson-context]'); - const stepBubbles = root.querySelector('[data-workshop-step-bubbles]'); let setupStep = 'workspace'; const showSetupStep = (stepName, opts = {}) => { @@ -866,12 +849,14 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? lessonPercent.textContent = `${progressPercent}%`; lessonBar.style.width = `${progressPercent}%`; lessonContext.textContent = stepIndex >= 0 - ? `${stepIndex + 1} of ${visibleFlow.length} in this ${journey.label.toLowerCase()} run.` + ? `${stepIndex + 1} of ${visibleFlow.length} in this ${journey.label} run.` : 'Linked step from the workshop source.'; stepSummary.textContent = activeStep.summary || 'Follow the guided path for this lesson.'; flowTitle.textContent = `${journey.label} x ${scenario.label}`; stepPosition.textContent = stepIndex >= 0 ? `Step ${stepIndex + 1} of ${visibleFlow.length}` : 'Linked step'; stepBodyContainer.innerHTML = renderTutorialStep(activeStep); + root.dataset.workshopFlowKeys = visibleFlow.join(','); + root.dataset.workshopCurrentStep = activeStep.key; root.querySelectorAll('[data-workshop-entry-path]').forEach((button) => { const isActive = button.getAttribute('data-workshop-entry-path') === state.entryPathId; @@ -885,24 +870,6 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? button.setAttribute('aria-pressed', String(isActive)); }); - if (stepBubbles) { - stepBubbles.innerHTML = ''; - visibleFlow.forEach((stepKey, index) => { - const step = stepMap.get(stepKey); - if (!step) return; - - const button = document.createElement('button'); - button.type = 'button'; - button.className = 'aw-workshop-step-bubble'; - button.dataset.workshopStepLink = step.key; - button.title = `${index + 1}. ${step.title}`; - button.setAttribute('aria-label', `Go to step ${index + 1}: ${step.title}`); - button.classList.toggle('is-complete', stepIndex > index); - button.classList.toggle('is-active', step.key === activeStep.key); - stepBubbles.appendChild(button); - }); - } - const flowIndex = visibleFlow.indexOf(activeStep.key); const isLastStep = flowIndex >= 0 && flowIndex >= visibleFlow.length - 1; prevButton.disabled = flowIndex <= 0; @@ -945,11 +912,6 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? return; } - if (target.matches('[data-workshop-step-link]')) { - setCurrentStep(target.getAttribute('data-workshop-step-link')); - return; - } - if (target.matches('[data-workshop-prev]')) { navigate('prev'); return; @@ -1032,12 +994,9 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-picker, .aw-workshop-panel-shell { border: 1px solid var(--aw-border); - background: - linear-gradient(135deg, rgba(var(--aw-accent-rgb), 0.12), transparent 50%), - var(--aw-bg-elevated); - backdrop-filter: blur(12px); + background: var(--aw-bg-elevated); border-radius: 1.25rem; - box-shadow: var(--aw-shadow); + box-shadow: 0 10px 24px rgba(1, 4, 9, 0.1); } .aw-workshop-picker-kicker, @@ -1081,9 +1040,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 0.95rem; border-radius: 1rem; border: 1px solid var(--aw-border); - background: - linear-gradient(135deg, rgba(var(--aw-accent-rgb), 0.12), transparent 55%), - var(--aw-bg-elevated); + background: var(--aw-bg-subtle); } .aw-workshop-tunnel-panel h3, @@ -1158,12 +1115,10 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 0.9rem; border: 1px solid color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 35%, transparent); - background: - linear-gradient(180deg, color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 12%, transparent), transparent 72%), - color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 8%, var(--aw-bg-elevated)); + background: color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 4%, var(--aw-bg-elevated)); color: inherit; cursor: pointer; - transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; + transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; } .aw-workshop-card-icon { @@ -1231,7 +1186,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-card.is-active { transform: translateY(-1px); border-color: var(--aw-workshop-card-accent, var(--sl-color-accent)); - box-shadow: 0 12px 30px rgba(1, 4, 9, 0.2); + box-shadow: 0 8px 18px rgba(1, 4, 9, 0.12); } .aw-workshop-card:hover .aw-workshop-card-fit, @@ -1274,29 +1229,31 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? align-items: center; justify-content: center; gap: 0.45rem; - border-radius: 999px; - min-height: 2.75rem; - padding: 0.7rem 1rem; - border: 1px solid var(--aw-border-strong); - background: rgba(255, 255, 255, 0.02); + border-radius: 0.75rem; + min-height: 2.5rem; + padding: 0.6rem 0.9rem; + border: 1px solid var(--aw-border); + background: var(--aw-bg-subtle); color: inherit; text-decoration: none; font: inherit; cursor: pointer; + box-shadow: none; } .aw-workshop-inline-button:hover, .aw-workshop-nav-button:hover { - border-color: var(--sl-color-accent); + border-color: var(--aw-border-strong); + background: color-mix(in srgb, var(--aw-bg-subtle) 88%, var(--sl-color-accent) 12%); text-decoration: none; } .aw-workshop-inline-button-subtle { - background: rgba(255, 255, 255, 0.03); + color: var(--aw-text-muted); } .aw-workshop-inline-button-home { - background: color-mix(in srgb, rgba(var(--aw-accent-rgb), 0.18) 70%, rgba(255, 255, 255, 0.03)); + font-weight: 600; } .aw-workshop-button-icon { @@ -1334,9 +1291,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 1rem; border: 1px solid var(--aw-border); - background: - linear-gradient(135deg, rgba(var(--aw-accent-rgb), 0.12), transparent 58%), - rgba(255, 255, 255, 0.035); + background: var(--aw-bg-subtle); } .aw-workshop-progress-overview { @@ -1379,21 +1334,16 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-progress-timeline { position: relative; - display: grid; + display: block; align-items: center; - min-height: 1.6rem; - padding: 0.1rem 0.35rem; - border-radius: 999px; - border: 1px solid var(--aw-border); - background: rgba(255, 255, 255, 0.03); + min-height: auto; } .aw-workshop-progress-track { - grid-area: 1 / 1; - height: 0.72rem; + height: 0.5rem; overflow: hidden; border-radius: 999px; - background: rgba(230, 237, 243, 0.12); + background: color-mix(in srgb, var(--aw-border) 70%, transparent); } .aw-workshop-progress-track > span { @@ -1401,50 +1351,9 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? height: 100%; border-radius: inherit; background: var(--sl-color-accent); - box-shadow: 0 0 16px rgba(var(--aw-accent-rgb), 0.36); transition: width 0.25s ease; } - .aw-workshop-step-bubbles { - grid-area: 1 / 1; - position: relative; - z-index: 1; - display: flex; - align-items: center; - justify-content: space-between; - gap: 0.18rem; - padding: 0 0.25rem; - } - - .aw-workshop-step-bubbles :global(.aw-workshop-step-bubble) { - width: 0.78rem; - height: 0.78rem; - min-width: 0.78rem; - padding: 0; - border-radius: 999px; - border: 2px solid rgba(13, 17, 23, 0.8); - background: rgba(230, 237, 243, 0.28); - cursor: pointer; - transition: background 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease, transform 0.18s ease; - } - - .aw-workshop-step-bubbles :global(.aw-workshop-step-bubble:hover), - .aw-workshop-step-bubbles :global(.aw-workshop-step-bubble:focus-visible) { - background: var(--sl-color-text-accent); - box-shadow: 0 0 0 3px rgba(var(--aw-accent-rgb), 0.18); - outline: none; - transform: translateY(-1px) scale(1.08); - } - - .aw-workshop-step-bubbles :global(.aw-workshop-step-bubble.is-complete) { - background: var(--sl-color-accent); - } - - .aw-workshop-step-bubbles :global(.aw-workshop-step-bubble.is-active) { - background: var(--sl-color-text-accent); - box-shadow: 0 0 0 3px rgba(var(--aw-accent-rgb), 0.2); - } - .aw-workshop-step-content { display: block; min-width: 0; @@ -1453,10 +1362,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: clamp(1rem, 2vw, 1.5rem); border-radius: 1rem; border: 1px solid var(--aw-border); - background: - linear-gradient(180deg, rgba(var(--aw-accent-rgb), 0.06), transparent 14%), - rgba(1, 4, 9, 0.22); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); + background: color-mix(in srgb, var(--aw-bg-subtle) 88%, transparent); } .aw-workshop-step-content :global(h2), @@ -1585,9 +1491,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 0.95rem; border: 1px solid color-mix(in srgb, var(--aw-border) 88%, transparent); - background: - linear-gradient(180deg, rgba(var(--aw-accent-rgb), 0.1), transparent 65%), - rgba(255, 255, 255, 0.03); + background: color-mix(in srgb, var(--aw-bg-elevated) 92%, var(--sl-color-accent) 8%); } .aw-workshop-step-content :global(.aw-workshop-entry-card h4), @@ -1763,17 +1667,6 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? line-height: 1.72; } - .aw-workshop-step-bubbles { - gap: 0.12rem; - padding: 0 0.12rem; - } - - .aw-workshop-step-bubbles :global(.aw-workshop-step-bubble) { - width: 0.62rem; - height: 0.62rem; - min-width: 0.62rem; - } - .aw-workshop-flow-header, .aw-workshop-panel-header, .aw-workshop-panel-footer { diff --git a/docs/tests/workshop.spec.ts b/docs/tests/workshop.spec.ts index 50c02c43412..2abc6adfe93 100644 --- a/docs/tests/workshop.spec.ts +++ b/docs/tests/workshop.spec.ts @@ -21,36 +21,58 @@ async function startWorkshop(page: Page) { await expect(page.locator('[data-workshop-tutorial]')).toBeVisible(); } +async function getFlowStepKeys(page: Page): Promise { + return page.evaluate(() => { + const value = document.querySelector('[data-workshop-root]')?.getAttribute('data-workshop-flow-keys') ?? ''; + return value ? value.split(',').filter(Boolean) : []; + }); +} + +async function getCurrentStepKey(page: Page): Promise { + return page.evaluate(() => document.querySelector('[data-workshop-root]')?.getAttribute('data-workshop-current-step') ?? ''); +} + +async function goToStepIfVisible(page: Page, targetStepKey: string): Promise { + const flowKeys = await getFlowStepKeys(page); + if (!flowKeys.includes(targetStepKey)) return false; + + for (let index = 0; index < flowKeys.length; index++) { + if ((await getCurrentStepKey(page)) === targetStepKey) return true; + const nextButton = page.getByRole('button', { name: /Next step|Finish workshop/i }); + if (await nextButton.isDisabled()) break; + await nextButton.click(); + } + + return (await getCurrentStepKey(page)) === targetStepKey; +} + test.describe('Workshop tutorial', () => { - test('progress rail follows the active step instead of saved completion history', async ({ page }) => { + test('progress summary follows the active step instead of saved completion history', async ({ page }) => { await startWorkshop(page); - const bubbles = page.locator('[data-workshop-step-bubbles] .aw-workshop-step-bubble'); - const bubbleCount = await bubbles.count(); - const firstStepPercent = bubbleCount <= 1 ? 100 : 0; - const thirdStepPercent = bubbleCount <= 1 ? 100 : Math.round((2 / (bubbleCount - 1)) * 100); + const flowKeys = await getFlowStepKeys(page); + const flowLength = flowKeys.length; + const firstStepPercent = flowLength <= 1 ? 100 : 0; + const thirdStepPercent = flowLength <= 1 ? 100 : Math.round((2 / (flowLength - 1)) * 100); - await expect(page.locator('[data-workshop-step-position]')).toHaveText(`Step 1 of ${bubbleCount}`); + await expect(page.locator('[data-workshop-step-position]')).toHaveText(`Step 1 of ${flowLength}`); await expect(page.locator('[data-workshop-lesson-percent]')).toHaveText(`${firstStepPercent}%`); - await expect(bubbles.nth(0)).toHaveClass(/is-active/); - await expect(bubbles.nth(0)).not.toHaveClass(/is-complete/); + await expect(page.locator('[data-workshop-lesson-context]')).toHaveText(`1 of ${flowLength} in this GitHub.com run.`); + await expect(page.locator('.aw-workshop-progress-card')).not.toContainText('Go to step'); await page.getByRole('button', { name: /Next step/i }).click(); await page.getByRole('button', { name: /Next step/i }).click(); - await expect(page.locator('[data-workshop-step-position]')).toHaveText(`Step 3 of ${bubbleCount}`); + await expect(page.locator('[data-workshop-step-position]')).toHaveText(`Step 3 of ${flowLength}`); await expect(page.locator('[data-workshop-lesson-percent]')).toHaveText(`${thirdStepPercent}%`); - await expect(bubbles.nth(0)).toHaveClass(/is-complete/); - await expect(bubbles.nth(1)).toHaveClass(/is-complete/); - await expect(bubbles.nth(2)).toHaveClass(/is-active/); + await expect(page.locator('[data-workshop-lesson-context]')).toHaveText(`3 of ${flowLength} in this GitHub.com run.`); - await bubbles.nth(0).click(); + await page.getByRole('button', { name: /Previous step/i }).click(); + await page.getByRole('button', { name: /Previous step/i }).click(); - await expect(page.locator('[data-workshop-step-position]')).toHaveText(`Step 1 of ${bubbleCount}`); + await expect(page.locator('[data-workshop-step-position]')).toHaveText(`Step 1 of ${flowLength}`); await expect(page.locator('[data-workshop-lesson-percent]')).toHaveText(`${firstStepPercent}%`); - await expect(bubbles.nth(0)).toHaveClass(/is-active/); - await expect(bubbles.nth(0)).not.toHaveClass(/is-complete/); - await expect(bubbles.nth(1)).not.toHaveClass(/is-complete/); + await expect(page.locator('[data-workshop-lesson-context]')).toHaveText(`1 of ${flowLength} in this GitHub.com run.`); }); test('switching entry path clears previous scenario and restarts the flow', async ({ page }) => { @@ -363,8 +385,7 @@ test.describe('Workshop Astro rendering contract', () => { // Locate the first step in the visible flow that contains a data-workshop-local-link, // navigating forward until one is found or the flow ends. - const bubbles = page.locator('[data-workshop-step-bubbles] .aw-workshop-step-bubble'); - const flowLength = await bubbles.count(); + const flowLength = (await getFlowStepKeys(page)).length; let localLink = page.locator('[data-workshop-step-content] [data-workshop-local-link]').first(); let found = await localLink.isVisible(); @@ -420,19 +441,9 @@ test.describe('Workshop Astro rendering contract', () => { // Raw remark-gfm classes must not appear in any step HTML — they should have been rewritten. expect(result.hasRawMarkers).toBe(false); - // If the workshop content includes task lists, navigate to the step and verify the - // checklist is rendered with the expected workshop class. The bubble list reflects - // only the current route's visibleFlow, so the step may not be present; in that - // case the UI assertion is skipped rather than failing on missing navigation. - if (result.hasTaskLists && result.firstTaskListStepKey) { - const bubble = page.locator( - `[data-workshop-step-bubbles] .aw-workshop-step-bubble[data-workshop-step-link="${result.firstTaskListStepKey}"]` - ); - if ((await bubble.count()) > 0) { - await bubble.first().click(); - const checklist = page.locator('[data-workshop-step-content] ul.aw-workshop-checklist').first(); - await expect(checklist).toBeVisible(); - } + if (result.hasTaskLists && result.firstTaskListStepKey && await goToStepIfVisible(page, result.firstTaskListStepKey)) { + const checklist = page.locator('[data-workshop-step-content] ul.aw-workshop-checklist').first(); + await expect(checklist).toBeVisible(); } }); @@ -456,19 +467,9 @@ test.describe('Workshop Astro rendering contract', () => { // Raw [!TYPE] markers must not appear in any step HTML. expect(result.hasRawMarkers).toBe(false); - // If the workshop content includes GFM alerts, navigate to the step by its - // key via the data-workshop-step-link attribute. The bubble list reflects - // only the current route's visibleFlow, so the step may not be present; in - // that case the UI assertion is skipped rather than clicking the wrong bubble. - if (result.hasAlerts && result.firstAlertStepKey) { - const bubble = page.locator( - `[data-workshop-step-bubbles] .aw-workshop-step-bubble[data-workshop-step-link="${result.firstAlertStepKey}"]` - ); - if ((await bubble.count()) > 0) { - await bubble.first().click(); - const aside = page.locator('[data-workshop-step-content] aside[class*="aw-workshop-admonition-"]').first(); - await expect(aside).toBeVisible(); - } + if (result.hasAlerts && result.firstAlertStepKey && await goToStepIfVisible(page, result.firstAlertStepKey)) { + const aside = page.locator('[data-workshop-step-content] aside[class*="aw-workshop-admonition-"]').first(); + await expect(aside).toBeVisible(); } }); }); @@ -481,7 +482,7 @@ test.describe('Workshop Astro rendering contract', () => { // the bubble-rail step keys that it produced. // --------------------------------------------------------------------------- -async function getFlowStepKeys(page: Page, journeyId: string, scenarioId: string): Promise { +async function getFlowStepKeysForRoute(page: Page, journeyId: string, scenarioId: string): Promise { // Clear any stale session state so only the hash URL drives the flow. await page.goto('/gh-aw/workshop/'); await page.waitForLoadState('networkidle'); @@ -493,35 +494,32 @@ async function getFlowStepKeys(page: Page, journeyId: string, scenarioId: string await page.waitForLoadState('networkidle'); await expect(page.locator('[data-workshop-tutorial]')).toBeVisible(); - return page.evaluate((): string[] => { - const bubbles = document.querySelectorAll('[data-workshop-step-bubbles] [data-workshop-step-link]'); - return [...bubbles].map(b => b.getAttribute('data-workshop-step-link') ?? ''); - }); + return getFlowStepKeys(page); } test.describe('Workshop flow filtering: scenario isolation', () => { test('github+daily-status includes scenario-a build step and excludes scenario-b/c', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'github', 'daily-status'); + const keys = await getFlowStepKeysForRoute(page, 'github', 'daily-status'); expect(keys).toContain('11a-build-daily-status-ui'); expect(keys).not.toContain('11b-build-daily-docs-ui'); expect(keys).not.toContain('11c-build-pr-reviewer-ui'); }); test('github+daily-docs includes scenario-b build step and excludes scenario-a/c', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'github', 'daily-docs'); + const keys = await getFlowStepKeysForRoute(page, 'github', 'daily-docs'); expect(keys).toContain('11b-build-daily-docs-ui'); expect(keys).not.toContain('11a-build-daily-status-ui'); expect(keys).not.toContain('11c-build-pr-reviewer-ui'); }); test('terminal+daily-status includes terminal build step and excludes ui build step', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'terminal', 'daily-status'); + const keys = await getFlowStepKeysForRoute(page, 'terminal', 'daily-status'); expect(keys).toContain('11a-build-daily-status-terminal'); expect(keys).not.toContain('11a-build-daily-status-ui'); }); test('terminal+pr-reviewer includes terminal build step and excludes ui build step', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'terminal', 'pr-reviewer'); + const keys = await getFlowStepKeysForRoute(page, 'terminal', 'pr-reviewer'); expect(keys).toContain('11c-build-pr-reviewer-terminal'); expect(keys).not.toContain('11c-build-pr-reviewer-ui'); }); @@ -529,21 +527,21 @@ test.describe('Workshop flow filtering: scenario isolation', () => { test.describe('Workshop flow filtering: hub page removal', () => { test('github journey excludes numeric-prefix hub when letter-variant step exists', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'github', 'daily-status'); + const keys = await getFlowStepKeysForRoute(page, 'github', 'daily-status'); // 06-install-gh-aw (all/core hub) should be replaced by 06c-install-ui expect(keys).not.toContain('06-install-gh-aw'); expect(keys).toContain('06c-install-ui'); }); test('github journey excludes alphanumeric-prefix hub when journey-specific variant exists', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'github', 'daily-status'); + const keys = await getFlowStepKeysForRoute(page, 'github', 'daily-status'); // 11a-build-daily-status (all/scenario-a hub) should be replaced by 11a-build-daily-status-ui expect(keys).not.toContain('11a-build-daily-status'); expect(keys).toContain('11a-build-daily-status-ui'); }); test('terminal journey excludes all-journey hub when terminal-specific variant exists', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'terminal', 'daily-status'); + const keys = await getFlowStepKeysForRoute(page, 'terminal', 'daily-status'); // 11a-build-daily-status (all/scenario-a hub) should be replaced by terminal variant expect(keys).not.toContain('11a-build-daily-status'); expect(keys).toContain('11a-build-daily-status-terminal'); @@ -552,7 +550,7 @@ test.describe('Workshop flow filtering: hub page removal', () => { test.describe('Workshop flow filtering: Copilot scenario-d substitution', () => { test('copilot+daily-status uses scenario-d build steps and excludes ui-journey scenario-a build step', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'copilot', 'daily-status'); + const keys = await getFlowStepKeysForRoute(page, 'copilot', 'daily-status'); // scenario-d build step must be present expect(keys).toContain('11d-build-copilot-agents'); // ui-journey scenario-a build step must be absent (copilot exclusion) @@ -560,13 +558,13 @@ test.describe('Workshop flow filtering: Copilot scenario-d substitution', () => }); test('copilot+daily-docs uses scenario-d build steps and excludes ui-journey scenario-b build step', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'copilot', 'daily-docs'); + const keys = await getFlowStepKeysForRoute(page, 'copilot', 'daily-docs'); expect(keys).toContain('11d-build-copilot-agents'); expect(keys).not.toContain('11b-build-daily-docs-ui'); }); test('copilot+pr-reviewer uses scenario-d build steps and excludes ui-journey scenario-c build step', async ({ page }) => { - const keys = await getFlowStepKeys(page, 'copilot', 'pr-reviewer'); + const keys = await getFlowStepKeysForRoute(page, 'copilot', 'pr-reviewer'); expect(keys).toContain('11d-build-copilot-agents'); expect(keys).not.toContain('11c-build-pr-reviewer-ui'); }); From 318a6e6635cfd469661b39800be7ee67095db969 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 10:54:47 +0000 Subject: [PATCH 3/5] Address workshop UI review feedback Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- docs/src/components/workshop/WorkshopExperience.astro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index 5ca3361e918..f8042c56cd0 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -1118,7 +1118,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? background: color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 4%, var(--aw-bg-elevated)); color: inherit; cursor: pointer; - transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; + transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; } .aw-workshop-card-icon { From adc2be50ca3e9d14ed628b7560a8996034903af0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 11:01:47 +0000 Subject: [PATCH 4/5] Clean up workshop test helpers Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- docs/tests/workshop.spec.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/tests/workshop.spec.ts b/docs/tests/workshop.spec.ts index 2abc6adfe93..ba0564690a4 100644 --- a/docs/tests/workshop.spec.ts +++ b/docs/tests/workshop.spec.ts @@ -36,7 +36,7 @@ async function goToStepIfVisible(page: Page, targetStepKey: string): Promise { + return Boolean(isPresent && stepKey && await goToStepIfVisible(page, stepKey)); +} + test.describe('Workshop tutorial', () => { test('progress summary follows the active step instead of saved completion history', async ({ page }) => { await startWorkshop(page); @@ -441,7 +445,7 @@ test.describe('Workshop Astro rendering contract', () => { // Raw remark-gfm classes must not appear in any step HTML — they should have been rewritten. expect(result.hasRawMarkers).toBe(false); - if (result.hasTaskLists && result.firstTaskListStepKey && await goToStepIfVisible(page, result.firstTaskListStepKey)) { + if (await shouldNavigateToVisibleStep(page, result.hasTaskLists, result.firstTaskListStepKey)) { const checklist = page.locator('[data-workshop-step-content] ul.aw-workshop-checklist').first(); await expect(checklist).toBeVisible(); } @@ -467,7 +471,7 @@ test.describe('Workshop Astro rendering contract', () => { // Raw [!TYPE] markers must not appear in any step HTML. expect(result.hasRawMarkers).toBe(false); - if (result.hasAlerts && result.firstAlertStepKey && await goToStepIfVisible(page, result.firstAlertStepKey)) { + if (await shouldNavigateToVisibleStep(page, result.hasAlerts, result.firstAlertStepKey)) { const aside = page.locator('[data-workshop-step-content] aside[class*="aw-workshop-admonition-"]').first(); await expect(aside).toBeVisible(); } From 258d2b4c78426b37f0ddb4fdf3029ca1e27ca79f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 19 Jul 2026 11:12:50 +0000 Subject: [PATCH 5/5] Align workshop styling with docs surfaces Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- .../workshop/WorkshopExperience.astro | 64 +++++++++++-------- 1 file changed, 38 insertions(+), 26 deletions(-) diff --git a/docs/src/components/workshop/WorkshopExperience.astro b/docs/src/components/workshop/WorkshopExperience.astro index f8042c56cd0..fd933231b00 100644 --- a/docs/src/components/workshop/WorkshopExperience.astro +++ b/docs/src/components/workshop/WorkshopExperience.astro @@ -994,9 +994,9 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-picker, .aw-workshop-panel-shell { border: 1px solid var(--aw-border); - background: var(--aw-bg-elevated); - border-radius: 1.25rem; - box-shadow: 0 10px 24px rgba(1, 4, 9, 0.1); + background: var(--aw-bg-subtle); + border-radius: 1rem; + box-shadow: none; } .aw-workshop-picker-kicker, @@ -1040,7 +1040,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 0.95rem; border-radius: 1rem; border: 1px solid var(--aw-border); - background: var(--aw-bg-subtle); + background: var(--aw-bg-page); } .aw-workshop-tunnel-panel h3, @@ -1113,12 +1113,12 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? min-height: 0; min-height: 15rem; padding: 1rem; - border-radius: 0.9rem; - border: 1px solid color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 35%, transparent); - background: color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 4%, var(--aw-bg-elevated)); + border-radius: 0.85rem; + border: 1px solid var(--aw-border); + background: var(--aw-bg-page); color: inherit; cursor: pointer; - transition: transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; + transition: border-color 0.2s ease, background 0.2s ease; } .aw-workshop-card-icon { @@ -1138,8 +1138,8 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? align-self: start; padding: 0.22rem 0.5rem; border-radius: 999px; - border: 1px solid color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 24%, transparent); - background: color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 14%, transparent); + border: 1px solid var(--aw-border); + background: color-mix(in srgb, var(--aw-bg-subtle) 85%, transparent); color: var(--aw-text-muted); font-size: 0.68rem; font-weight: 700; @@ -1184,9 +1184,8 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-card:hover, .aw-workshop-card.is-active { - transform: translateY(-1px); border-color: var(--aw-workshop-card-accent, var(--sl-color-accent)); - box-shadow: 0 8px 18px rgba(1, 4, 9, 0.12); + background: color-mix(in srgb, var(--aw-workshop-card-accent, var(--sl-color-accent)) 6%, var(--aw-bg-page)); } .aw-workshop-card:hover .aw-workshop-card-fit, @@ -1229,14 +1228,16 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? align-items: center; justify-content: center; gap: 0.45rem; - border-radius: 0.75rem; - min-height: 2.5rem; - padding: 0.6rem 0.9rem; + border-radius: 0.7rem; + min-height: 2.35rem; + padding: 0.55rem 0.85rem; border: 1px solid var(--aw-border); - background: var(--aw-bg-subtle); + background: var(--aw-bg-page); color: inherit; text-decoration: none; font: inherit; + font-size: 0.95rem; + font-weight: 600; cursor: pointer; box-shadow: none; } @@ -1244,7 +1245,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-inline-button:hover, .aw-workshop-nav-button:hover { border-color: var(--aw-border-strong); - background: color-mix(in srgb, var(--aw-bg-subtle) 88%, var(--sl-color-accent) 12%); + background: var(--aw-bg-subtle); text-decoration: none; } @@ -1253,7 +1254,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? } .aw-workshop-inline-button-home { - font-weight: 600; + color: var(--aw-text-muted); } .aw-workshop-button-icon { @@ -1291,7 +1292,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 1rem; border: 1px solid var(--aw-border); - background: var(--aw-bg-subtle); + background: var(--aw-bg-page); } .aw-workshop-progress-overview { @@ -1343,7 +1344,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? height: 0.5rem; overflow: hidden; border-radius: 999px; - background: color-mix(in srgb, var(--aw-border) 70%, transparent); + background: color-mix(in srgb, var(--aw-bg-subtle) 80%, var(--aw-border) 20%); } .aw-workshop-progress-track > span { @@ -1362,7 +1363,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: clamp(1rem, 2vw, 1.5rem); border-radius: 1rem; border: 1px solid var(--aw-border); - background: color-mix(in srgb, var(--aw-bg-subtle) 88%, transparent); + background: var(--aw-bg-page); } .aw-workshop-step-content :global(h2), @@ -1404,7 +1405,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? .aw-workshop-step-content :global(code) { padding: 0.1rem 0.3rem; border-radius: 0.35rem; - background: rgba(255, 255, 255, 0.08); + background: var(--aw-bg-subtle); } .aw-workshop-step-content :global(pre) { @@ -1412,7 +1413,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 0.8rem; border: 1px solid var(--aw-border); - background: rgba(255, 255, 255, 0.04); + background: var(--aw-bg-subtle); overflow-x: auto; } @@ -1491,7 +1492,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 0.95rem; border: 1px solid color-mix(in srgb, var(--aw-border) 88%, transparent); - background: color-mix(in srgb, var(--aw-bg-elevated) 92%, var(--sl-color-accent) 8%); + background: var(--aw-bg-subtle); } .aw-workshop-step-content :global(.aw-workshop-entry-card h4), @@ -1581,7 +1582,7 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? padding: 1rem; border-radius: 1rem; border: 1px solid var(--aw-border); - background: rgba(255, 255, 255, 0.03); + background: var(--aw-bg-subtle); overflow-x: auto; white-space: pre-wrap; font: 0.95rem/1.5 var(--sl-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); @@ -1603,7 +1604,18 @@ const initialStep = workshopSteps.find((item) => item.key === initialStepKey) ?? background: var(--sl-color-accent); color: var(--sl-color-text-invert); border-color: transparent; - box-shadow: 0 12px 28px rgba(var(--aw-accent-rgb), 0.22); + box-shadow: none; + } + + :root[data-theme='light'] .aw-workshop-card, + :root[data-theme='light'] .aw-workshop-progress-card, + :root[data-theme='light'] .aw-workshop-step-content, + :root[data-theme='light'] .aw-workshop-step-content :global(.aw-workshop-entry-card), + :root[data-theme='light'] .aw-workshop-step-markdown, + :root[data-theme='light'] .aw-workshop-inline-button, + :root[data-theme='light'] .aw-workshop-nav-button, + :root[data-theme='light'] .aw-workshop-tunnel-panel { + box-shadow: none; } @media (max-width: 72rem) {