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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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 | [](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) {