From b4f9594fc484e8f98a92fe9a82af22cdcac5400b Mon Sep 17 00:00:00 2001 From: Amiel Peled Date: Thu, 20 Aug 2026 14:18:52 +0300 Subject: [PATCH 1/6] fix(decks): code panels no longer inherit rtl from the slide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every slide's root carries dir={dir}, which is rtl in Hebrew, and the code panels inside it inherited it. The bidi algorithm then resolved each line's trailing neutrals against an RTL paragraph and moved them to the front, so def test_system_prompt_includes_persona(): rendered as :()def test_system_prompt_includes_persona Every deck was affected, because the panels are copy-shared between the ten artifacts. Code reads left-to-right whatever the prose around it does, so each panel now says so itself: direction: 'ltr' plus textAlign: 'left', because direction alone leaves text-align: start, which an ancestor's explicit textAlign: 'right' still wins over — and several slides set exactly that on the column holding the panel. 246 declarations across 98 slide components in all ten decks. tests/unit/lectureDecks.spec.ts gains three cases, in the file that already guards the copy-shared stage logic: one that there are panels to find at all, so a regex that stops matching cannot turn the others green, and one each for direction and alignment. Checked by mutation — removing a single declaration from one slide in one deck fails the suite. Verified in a browser as well as in the source: all 323 slides in all ten decks were loaded with ?lang=he and every element that introduces a monospace family was asserted to compute direction: ltr. That sweep is what caught the last ten, which sit in single-line style objects that Prettier writes without a trailing comma — the first pass required one and skipped them, and the first version of the test had the same blind spot. Co-Authored-By: Claude Opus 5 (1M context) --- .../slides/WorkedExampleGoldenDataset.tsx | 2 + .../slides/WorkedExampleHallucination.tsx | 2 + .../pages/slides/WorkedExampleLlmAsJudge.tsx | 2 + .../src/pages/slides/LatencyMetrics.tsx | 2 + .../src/pages/slides/UnitLayer.tsx | 2 + .../slides/WorkedExampleCostTracking.tsx | 2 + .../pages/slides/WorkedExampleDriftAlert.tsx | 2 + .../slides/WorkedExampleEvalAuditLog.tsx | 2 + .../slides/WorkedExampleGoldenSetEval.tsx | 2 + .../WorkedExampleMaturityAssessment.tsx | 2 + .../WorkedExamplePerformanceBenchmarks.tsx | 2 + .../slides/WorkedExampleRolloutReport.tsx | 2 + .../slides/WorkedExampleScorecardInsert.tsx | 2 + .../slides/WorkedExampleScorecardQuery.tsx | 2 + .../slides/WorkedExampleSecurityFindings.tsx | 2 + .../src/pages/slides/TestableOutputs.tsx | 2 + .../slides/WorkedExampleBeforeAfterPrompt.tsx | 2 + .../src/pages/slides/WorkedExampleFewShot.tsx | 2 + .../slides/WorkedExampleInjectionCaught.tsx | 2 + .../pages/slides/CIIntegrationPatterns.tsx | 2 + .../pages/slides/NonDeterminismInPractice.tsx | 2 + .../slides/SchemaDesignBestPractices.tsx | 2 + .../WhenSchemaValidPassesAreNotEnough.tsx | 4 + .../slides/WorkedExampleFactualityCheck.tsx | 2 + .../slides/WorkedExampleSchemaValidation.tsx | 2 + .../WorkedExampleSemanticSimilarity.tsx | 2 + .../slides/AccessibilityFirstSelectors.tsx | 4 + .../pages/slides/DataTestIdConventions.tsx | 2 + .../src/pages/slides/MockingTheModelLayer.tsx | 2 + .../slides/PatternsForContentAssertions.tsx | 2 + .../slides/TestingRateLimitsAndRetries.tsx | 4 + .../pages/slides/ToolsAndLibrariesRecap.tsx | 2 + .../pages/slides/WaitStrategiesDeepDive.tsx | 2 + .../slides/WorkedExampleDynamicContent.tsx | 2 + .../slides/WorkedExampleResilientSelector.tsx | 2 + .../slides/WorkedExampleStreamingTest.tsx | 2 + .../src/pages/slides/BringingItTogether.tsx | 2 + .../src/pages/slides/CaseStudyTriageAPI.tsx | 2 + .../src/pages/slides/FallbackBehavior.tsx | 2 + .../src/pages/slides/HallucinatedFields.tsx | 2 + .../src/pages/slides/LLMAsJudge.tsx | 2 + .../src/pages/slides/LatencyBudgets.tsx | 2 + .../pages/slides/NonDeterminismContracts.tsx | 4 + .../src/pages/slides/ProblemStatement.tsx | 4 + .../src/pages/slides/RateLimitRetry.tsx | 2 + .../slides/SemanticSimilarityConcept.tsx | 2 + .../pages/slides/StrictContractConcept.tsx | 2 + .../pages/slides/WorkedExampleEdgeCases.tsx | 2 + .../src/pages/slides/WorkedExampleMocking.tsx | 2 + .../slides/WorkedExampleSchemaValidation.tsx | 2 + .../src/pages/slides/CostBudget.tsx | 2 + .../src/pages/slides/CostLatencyAlerting.tsx | 2 + .../src/pages/slides/EnvironmentSecrets.tsx | 2 + .../src/pages/slides/ResponseCaching.tsx | 2 + .../src/pages/slides/ShardingConcept.tsx | 2 + .../src/pages/slides/TemperatureControl.tsx | 2 + .../slides/WorkedExampleGitHubActions.tsx | 2 + .../pages/slides/WorkedExampleJudgeGate.tsx | 2 + .../slides/WorkedExampleRetryWrapper.tsx | 2 + .../pages/slides/AutomatedRedTeamHarness.tsx | 2 + .../slides/DirectVsIndirectInjection.tsx | 4 + .../pages/slides/JailbreakingTechniques.tsx | 6 ++ .../src/pages/slides/SystemPromptLeakage.tsx | 6 ++ .../pages/slides/TrainingDataExtraction.tsx | 2 + .../slides/WorkedExampleAdversarialTrend.tsx | 2 + .../slides/WorkedExampleCanaryTracking.tsx | 2 + .../slides/WorkedExampleFindingsTrend.tsx | 2 + .../pages/slides/WorkedExampleGuardrailCI.tsx | 2 + .../slides/WorkedExampleIncidentQuery.tsx | 2 + .../slides/WorkedExampleInjectionLog.tsx | 2 + .../pages/slides/WorkedExamplePIIFinding.tsx | 2 + .../slides/WorkedExampleRateLimitAudit.tsx | 2 + .../slides/WorkedExampleSecurityScore.tsx | 2 + .../pages/slides/WorkedExampleTokenSpend.tsx | 2 + .../src/pages/slides/TokenCostPerRequest.tsx | 2 + .../slides/WorkedExampleAggregateRunStats.tsx | 14 ++- .../WorkedExampleBaselineComparison.tsx | 14 ++- .../slides/WorkedExampleCostRegression.tsx | 14 ++- .../slides/WorkedExampleLatencyBenchmark.tsx | 14 ++- .../WorkedExampleModelCostComparison.tsx | 14 ++- .../slides/WorkedExampleQueryTokenTrends.tsx | 14 ++- .../slides/WorkedExampleStoreTestConfig.tsx | 14 ++- .../slides/WorkedExampleStreamingMetrics.tsx | 14 ++- .../slides/WorkedExampleThroughputResults.tsx | 14 ++- .../slides/WorkedExampleWriteRunSummary.tsx | 14 ++- .../src/pages/slides/CursorForTests.tsx | 2 + .../src/pages/slides/EdgeCaseDiscovery.tsx | 2 + .../src/pages/slides/GeneratingFromCode.tsx | 2 + .../slides/WorkedExampleAcceptanceRate.tsx | 2 + .../slides/WorkedExampleCIRunHistory.tsx | 2 + .../slides/WorkedExampleCoverageDeltas.tsx | 2 + .../WorkedExampleGeneratorComparison.tsx | 2 + .../WorkedExamplePerformanceBenchmarks.tsx | 2 + .../slides/WorkedExampleSecurityFindings.tsx | 2 + .../WorkedExampleStoreGeneratedTests.tsx | 2 + .../slides/WorkedExampleStrategyMetrics.tsx | 2 + .../src/pages/slides/WorkedExampleTestROI.tsx | 2 + .../slides/WorkedExampleTriageVerdicts.tsx | 2 + tests/unit/lectureDecks.spec.ts | 95 +++++++++++++++++++ 99 files changed, 421 insertions(+), 10 deletions(-) diff --git a/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleGoldenDataset.tsx b/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleGoldenDataset.tsx index 7342ffd..68cc9d8 100644 --- a/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleGoldenDataset.tsx +++ b/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleGoldenDataset.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleHallucination.tsx b/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleHallucination.tsx index cd906e8..5541540 100644 --- a/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleHallucination.tsx +++ b/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleHallucination.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleLlmAsJudge.tsx b/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleLlmAsJudge.tsx index 582294a..49a5bbf 100644 --- a/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleLlmAsJudge.tsx +++ b/artifacts/ai-testing-lecture-1/src/pages/slides/WorkedExampleLlmAsJudge.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/LatencyMetrics.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/LatencyMetrics.tsx index e0708a9..405aed1 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/LatencyMetrics.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/LatencyMetrics.tsx @@ -205,6 +205,8 @@ export default function LatencyMetrics() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: "'SFMono-Regular', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1.1vw', color: '#1E3A5F', }} diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/UnitLayer.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/UnitLayer.tsx index 64eb634..79d4fed 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/UnitLayer.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/UnitLayer.tsx @@ -177,6 +177,8 @@ export default function UnitLayer() { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', height: '100%', boxSizing: 'border-box', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleCostTracking.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleCostTracking.tsx index 15d0c38..68382d9 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleCostTracking.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleCostTracking.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleDriftAlert.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleDriftAlert.tsx index 4d83a4e..8a49632 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleDriftAlert.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleDriftAlert.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleEvalAuditLog.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleEvalAuditLog.tsx index c4ee195..1761a99 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleEvalAuditLog.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleEvalAuditLog.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleGoldenSetEval.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleGoldenSetEval.tsx index b2884e7..a922b72 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleGoldenSetEval.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleGoldenSetEval.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleMaturityAssessment.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleMaturityAssessment.tsx index cac6583..1eab356 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleMaturityAssessment.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleMaturityAssessment.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx index 5b802f9..f16db80 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleRolloutReport.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleRolloutReport.tsx index bccf17c..4cde7fa 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleRolloutReport.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleRolloutReport.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardInsert.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardInsert.tsx index f3e9aac..9edc2ea 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardInsert.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardInsert.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardQuery.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardQuery.tsx index 1f6eee8..dce14ce 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardQuery.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleScorecardQuery.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleSecurityFindings.tsx b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleSecurityFindings.tsx index 8cfd0dd..aef99c2 100644 --- a/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleSecurityFindings.tsx +++ b/artifacts/ai-testing-lecture-10/src/pages/slides/WorkedExampleSecurityFindings.tsx @@ -33,6 +33,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-2/src/pages/slides/TestableOutputs.tsx b/artifacts/ai-testing-lecture-2/src/pages/slides/TestableOutputs.tsx index ceace96..5b501be 100644 --- a/artifacts/ai-testing-lecture-2/src/pages/slides/TestableOutputs.tsx +++ b/artifacts/ai-testing-lecture-2/src/pages/slides/TestableOutputs.tsx @@ -27,6 +27,8 @@ const dot: React.CSSProperties = { }; const codeLine: React.CSSProperties = { fontFamily: "'Menlo', 'Consolas', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '0.95vw', color: '#1E3A5F', }; diff --git a/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleBeforeAfterPrompt.tsx b/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleBeforeAfterPrompt.tsx index 35e8d75..0f2f66e 100644 --- a/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleBeforeAfterPrompt.tsx +++ b/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleBeforeAfterPrompt.tsx @@ -24,6 +24,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '2.4vh 1.8vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleFewShot.tsx b/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleFewShot.tsx index 92340dc..a845405 100644 --- a/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleFewShot.tsx +++ b/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleFewShot.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '2.6vh 2.2vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleInjectionCaught.tsx b/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleInjectionCaught.tsx index c8e973b..363caf9 100644 --- a/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleInjectionCaught.tsx +++ b/artifacts/ai-testing-lecture-2/src/pages/slides/WorkedExampleInjectionCaught.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '2.6vh 2.2vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/CIIntegrationPatterns.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/CIIntegrationPatterns.tsx index c0a8b2b..1eb9dfa 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/CIIntegrationPatterns.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/CIIntegrationPatterns.tsx @@ -198,6 +198,8 @@ export default function CIIntegrationPatterns() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/NonDeterminismInPractice.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/NonDeterminismInPractice.tsx index eea3b70..9195bf8 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/NonDeterminismInPractice.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/NonDeterminismInPractice.tsx @@ -147,6 +147,8 @@ export default function NonDeterminismInPractice() { fontSize: '1.1vw', color: '#E2E8F0', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.5, }} > diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/SchemaDesignBestPractices.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/SchemaDesignBestPractices.tsx index a741af2..e51ce38 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/SchemaDesignBestPractices.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/SchemaDesignBestPractices.tsx @@ -131,6 +131,8 @@ export default function SchemaDesignBestPractices() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', color: '#E2E8F0', lineHeight: 1.7, diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/WhenSchemaValidPassesAreNotEnough.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/WhenSchemaValidPassesAreNotEnough.tsx index b26edf1..a6e8f89 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/WhenSchemaValidPassesAreNotEnough.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/WhenSchemaValidPassesAreNotEnough.tsx @@ -133,6 +133,8 @@ export default function WhenSchemaValidPassesAreNotEnough() { borderRadius: '0.6vw', padding: '1.5vh 1.5vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', color: '#E2E8F0', lineHeight: 1.7, @@ -178,6 +180,8 @@ export default function WhenSchemaValidPassesAreNotEnough() { borderRadius: '0.6vw', padding: '1.5vh 1.5vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', color: '#E2E8F0', lineHeight: 1.7, diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleFactualityCheck.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleFactualityCheck.tsx index 4e2ad9e..1df7c78 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleFactualityCheck.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleFactualityCheck.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSchemaValidation.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSchemaValidation.tsx index 0f5a8f5..5863cc0 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSchemaValidation.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSchemaValidation.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSemanticSimilarity.tsx b/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSemanticSimilarity.tsx index d79f8ff..66fef0e 100644 --- a/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSemanticSimilarity.tsx +++ b/artifacts/ai-testing-lecture-3/src/pages/slides/WorkedExampleSemanticSimilarity.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/AccessibilityFirstSelectors.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/AccessibilityFirstSelectors.tsx index 2b7c8a2..9f44fea 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/AccessibilityFirstSelectors.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/AccessibilityFirstSelectors.tsx @@ -138,6 +138,8 @@ export default function AccessibilityFirstSelectors() { borderRadius: '0.5vw', padding: '1vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', color: '#7DD3C8', }} @@ -170,6 +172,8 @@ export default function AccessibilityFirstSelectors() { borderRadius: '0.5vw', padding: '1vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', color: '#7DD3C8', }} diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/DataTestIdConventions.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/DataTestIdConventions.tsx index 51c2262..793b451 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/DataTestIdConventions.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/DataTestIdConventions.tsx @@ -208,6 +208,8 @@ export default function DataTestIdConventions() { borderRadius: '0.4vw', padding: '0.6vh 0.8vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.85vw', color: '#7DD3C8', marginBottom: '0.8vh', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/MockingTheModelLayer.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/MockingTheModelLayer.tsx index e505bb3..2f33806 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/MockingTheModelLayer.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/MockingTheModelLayer.tsx @@ -138,6 +138,8 @@ export default function MockingTheModelLayer() { borderRadius: '0.5vw', padding: '0.8vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.85vw', color: '#7DD3C8', }} diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/PatternsForContentAssertions.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/PatternsForContentAssertions.tsx index 1cb9428..70e328d 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/PatternsForContentAssertions.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/PatternsForContentAssertions.tsx @@ -175,6 +175,8 @@ export default function PatternsForContentAssertions() { borderRadius: '0.5vw', padding: '1vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', color: '#7DD3C8', marginTop: 'auto', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/TestingRateLimitsAndRetries.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/TestingRateLimitsAndRetries.tsx index f4b5977..3cbf02d 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/TestingRateLimitsAndRetries.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/TestingRateLimitsAndRetries.tsx @@ -138,6 +138,8 @@ export default function TestingRateLimitsAndRetries() { borderRadius: '0.5vw', padding: '0.8vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.85vw', color: '#7DD3C8', }} @@ -170,6 +172,8 @@ export default function TestingRateLimitsAndRetries() { borderRadius: '0.5vw', padding: '0.8vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.85vw', color: '#7DD3C8', }} diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/ToolsAndLibrariesRecap.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/ToolsAndLibrariesRecap.tsx index be70337..3b451e9 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/ToolsAndLibrariesRecap.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/ToolsAndLibrariesRecap.tsx @@ -174,6 +174,8 @@ export default function ToolsAndLibrariesRecap() { borderRadius: '0.4vw', padding: '0.5vh 0.7vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.85vw', color: '#7DD3C8', display: 'inline-block', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/WaitStrategiesDeepDive.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/WaitStrategiesDeepDive.tsx index 93e2eab..2f1bd26 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/WaitStrategiesDeepDive.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/WaitStrategiesDeepDive.tsx @@ -236,6 +236,8 @@ export default function WaitStrategiesDeepDive() { borderRadius: '0.4vw', padding: '0.8vh 1vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.82vw', color: '#7DD3C8', wordBreak: 'break-all', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleDynamicContent.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleDynamicContent.tsx index 12a7628..f522d59 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleDynamicContent.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleDynamicContent.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleResilientSelector.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleResilientSelector.tsx index 29b3d12..8475f28 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleResilientSelector.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleResilientSelector.tsx @@ -24,6 +24,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '2.4vh 1.8vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleStreamingTest.tsx b/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleStreamingTest.tsx index 1438179..b36a50e 100644 --- a/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleStreamingTest.tsx +++ b/artifacts/ai-testing-lecture-4/src/pages/slides/WorkedExampleStreamingTest.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/BringingItTogether.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/BringingItTogether.tsx index 25afe40..c5a3852 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/BringingItTogether.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/BringingItTogether.tsx @@ -230,6 +230,8 @@ export default function BringingItTogether() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/CaseStudyTriageAPI.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/CaseStudyTriageAPI.tsx index acca175..42c1b31 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/CaseStudyTriageAPI.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/CaseStudyTriageAPI.tsx @@ -110,6 +110,8 @@ export default function CaseStudyTriageAPI() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.7, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/FallbackBehavior.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/FallbackBehavior.tsx index 673999e..bbf5545 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/FallbackBehavior.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/FallbackBehavior.tsx @@ -205,6 +205,8 @@ export default function FallbackBehavior() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/HallucinatedFields.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/HallucinatedFields.tsx index 8cac4f2..deaf9bc 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/HallucinatedFields.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/HallucinatedFields.tsx @@ -205,6 +205,8 @@ export default function HallucinatedFields() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/LLMAsJudge.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/LLMAsJudge.tsx index affc299..6dc5c32 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/LLMAsJudge.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/LLMAsJudge.tsx @@ -205,6 +205,8 @@ export default function LLMAsJudge() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.7, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/LatencyBudgets.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/LatencyBudgets.tsx index 51ed6bf..61ef308 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/LatencyBudgets.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/LatencyBudgets.tsx @@ -205,6 +205,8 @@ export default function LatencyBudgets() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/NonDeterminismContracts.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/NonDeterminismContracts.tsx index caf5578..42b95ba 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/NonDeterminismContracts.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/NonDeterminismContracts.tsx @@ -222,6 +222,8 @@ export default function NonDeterminismContracts() {
{t('assert response.status_code == 200', 'assert response.status_code == 200')} @@ -244,6 +246,8 @@ export default function ProblemStatement() { color: '#475569', lineHeight: 1.8, fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', }} >
diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/RateLimitRetry.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/RateLimitRetry.tsx index 250489e..ce3249a 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/RateLimitRetry.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/RateLimitRetry.tsx @@ -205,6 +205,8 @@ export default function RateLimitRetry() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/SemanticSimilarityConcept.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/SemanticSimilarityConcept.tsx index bbd70d1..b888ff8 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/SemanticSimilarityConcept.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/SemanticSimilarityConcept.tsx @@ -205,6 +205,8 @@ export default function SemanticSimilarityConcept() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.95vw', lineHeight: 1.8, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/StrictContractConcept.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/StrictContractConcept.tsx index f519c66..d883701 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/StrictContractConcept.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/StrictContractConcept.tsx @@ -205,6 +205,8 @@ export default function StrictContractConcept() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.95vw', lineHeight: 1.7, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleEdgeCases.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleEdgeCases.tsx index 63dc4f9..ca4680d 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleEdgeCases.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleEdgeCases.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleMocking.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleMocking.tsx index 1177825..b5fadea 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleMocking.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleMocking.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleSchemaValidation.tsx b/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleSchemaValidation.tsx index bbccad1..365f342 100644 --- a/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleSchemaValidation.tsx +++ b/artifacts/ai-testing-lecture-5/src/pages/slides/WorkedExampleSchemaValidation.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/CostBudget.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/CostBudget.tsx index 3ee2b53..d5b3309 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/CostBudget.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/CostBudget.tsx @@ -196,6 +196,8 @@ export default function CostBudget() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/CostLatencyAlerting.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/CostLatencyAlerting.tsx index 9c82285..7d1ac0f 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/CostLatencyAlerting.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/CostLatencyAlerting.tsx @@ -196,6 +196,8 @@ export default function CostLatencyAlerting() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/EnvironmentSecrets.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/EnvironmentSecrets.tsx index a8f7895..72fd04f 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/EnvironmentSecrets.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/EnvironmentSecrets.tsx @@ -196,6 +196,8 @@ export default function EnvironmentSecrets() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.85vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/ResponseCaching.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/ResponseCaching.tsx index 1efc2ef..cc2e1fe 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/ResponseCaching.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/ResponseCaching.tsx @@ -199,6 +199,8 @@ export default function ResponseCaching() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/ShardingConcept.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/ShardingConcept.tsx index 7b4c287..2f90786 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/ShardingConcept.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/ShardingConcept.tsx @@ -196,6 +196,8 @@ export default function ShardingConcept() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/TemperatureControl.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/TemperatureControl.tsx index 3e116e2..4cddc58 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/TemperatureControl.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/TemperatureControl.tsx @@ -196,6 +196,8 @@ export default function TemperatureControl() { borderRadius: '0.8vw', padding: '2vh 2vw', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', fontSize: '0.9vw', lineHeight: 1.8, }} diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleGitHubActions.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleGitHubActions.tsx index c9e3afa..1f8273e 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleGitHubActions.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleGitHubActions.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleJudgeGate.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleJudgeGate.tsx index 5147e0a..9a78040 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleJudgeGate.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleJudgeGate.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleRetryWrapper.tsx b/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleRetryWrapper.tsx index 2f556e7..ada39e9 100644 --- a/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleRetryWrapper.tsx +++ b/artifacts/ai-testing-lecture-6/src/pages/slides/WorkedExampleRetryWrapper.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-7/src/pages/slides/AutomatedRedTeamHarness.tsx b/artifacts/ai-testing-lecture-7/src/pages/slides/AutomatedRedTeamHarness.tsx index e5f8770..1a741be 100644 --- a/artifacts/ai-testing-lecture-7/src/pages/slides/AutomatedRedTeamHarness.tsx +++ b/artifacts/ai-testing-lecture-7/src/pages/slides/AutomatedRedTeamHarness.tsx @@ -249,6 +249,8 @@ export default function AutomatedRedTeamHarness() {
{t('Table', 'טבלה')}
-
+
throughput_runs
@@ -171,6 +181,8 @@ export default function WorkedExampleAggregateRunStats() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleBaselineComparison.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleBaselineComparison.tsx index 5924689..383cd2b 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleBaselineComparison.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleBaselineComparison.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -144,7 +146,15 @@ export default function WorkedExampleBaselineComparison() { > {t('Table', 'טבלה')}
-
+
perf_baselines
@@ -171,6 +181,8 @@ export default function WorkedExampleBaselineComparison() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleCostRegression.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleCostRegression.tsx index 4b43817..a9b8ba4 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleCostRegression.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleCostRegression.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -141,7 +143,15 @@ export default function WorkedExampleCostRegression() { > {t('Table', 'טבלה')}
-
+
request_costs
@@ -168,6 +178,8 @@ export default function WorkedExampleCostRegression() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleLatencyBenchmark.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleLatencyBenchmark.tsx index 132daa4..666f1c2 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleLatencyBenchmark.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleLatencyBenchmark.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -144,7 +146,15 @@ export default function WorkedExampleLatencyBenchmark() { > {t('Table', 'טבלה')} -
+
perf_runs
@@ -171,6 +181,8 @@ export default function WorkedExampleLatencyBenchmark() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleModelCostComparison.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleModelCostComparison.tsx index 12b5be8..d6607fd 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleModelCostComparison.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleModelCostComparison.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -141,7 +143,15 @@ export default function WorkedExampleModelCostComparison() { > {t('Table', 'טבלה')} -
+
request_costs
@@ -168,6 +178,8 @@ export default function WorkedExampleModelCostComparison() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleQueryTokenTrends.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleQueryTokenTrends.tsx index 6ef1535..61f0f15 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleQueryTokenTrends.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleQueryTokenTrends.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -141,7 +143,15 @@ export default function WorkedExampleQueryTokenTrends() { > {t('Table', 'טבלה')} -
+
request_costs
@@ -168,6 +178,8 @@ export default function WorkedExampleQueryTokenTrends() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStoreTestConfig.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStoreTestConfig.tsx index d4fdd37..60c1a66 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStoreTestConfig.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStoreTestConfig.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -141,7 +143,15 @@ export default function WorkedExampleStoreTestConfig() { > {t('Table', 'טבלה')} -
+
perf_test_configs
@@ -168,6 +178,8 @@ export default function WorkedExampleStoreTestConfig() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStreamingMetrics.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStreamingMetrics.tsx index a377ad6..a9c9575 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStreamingMetrics.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleStreamingMetrics.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -141,7 +143,15 @@ export default function WorkedExampleStreamingMetrics() { > {t('Table', 'טבלה')} -
+
perf_runs
@@ -168,6 +178,8 @@ export default function WorkedExampleStreamingMetrics() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleThroughputResults.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleThroughputResults.tsx index 1c26afe..aab0d49 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleThroughputResults.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleThroughputResults.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -144,7 +146,15 @@ export default function WorkedExampleThroughputResults() { > {t('Table', 'טבלה')} -
+
throughput_runs
@@ -171,6 +181,8 @@ export default function WorkedExampleThroughputResults() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleWriteRunSummary.tsx b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleWriteRunSummary.tsx index 8d18a16..9c86ac7 100644 --- a/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleWriteRunSummary.tsx +++ b/artifacts/ai-testing-lecture-8/src/pages/slides/WorkedExampleWriteRunSummary.tsx @@ -21,6 +21,8 @@ const codeBlock: React.CSSProperties = { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'Fira Code', 'Fira Mono', 'Courier New', monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1vw', lineHeight: 1.7, color: '#E2E8F0', @@ -141,7 +143,15 @@ export default function WorkedExampleWriteRunSummary() { > {t('Table', 'טבלה')} -
+
ci_run_summaries
@@ -168,6 +178,8 @@ export default function WorkedExampleWriteRunSummary() { fontSize: '0.95vw', color: '#CBD5E1', fontFamily: 'monospace', + direction: 'ltr', + textAlign: 'left', lineHeight: 1.6, }} > diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/CursorForTests.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/CursorForTests.tsx index a3bd47c..2e7c7b3 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/CursorForTests.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/CursorForTests.tsx @@ -22,6 +22,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/EdgeCaseDiscovery.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/EdgeCaseDiscovery.tsx index 3bf2f47..375bf9d 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/EdgeCaseDiscovery.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/EdgeCaseDiscovery.tsx @@ -185,6 +185,8 @@ export default function EdgeCaseDiscovery() { borderRadius: '0.8vw', padding: '2.5vh 2vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', fontSize: '1.05vw', lineHeight: 1.6, color: '#E2E8F0', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/GeneratingFromCode.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/GeneratingFromCode.tsx index 7c02cce..fb22b5c 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/GeneratingFromCode.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/GeneratingFromCode.tsx @@ -22,6 +22,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleAcceptanceRate.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleAcceptanceRate.tsx index 8aa38e9..76c677c 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleAcceptanceRate.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleAcceptanceRate.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCIRunHistory.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCIRunHistory.tsx index be83e9e..ae0db45 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCIRunHistory.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCIRunHistory.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCoverageDeltas.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCoverageDeltas.tsx index 271d902..94f225b 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCoverageDeltas.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleCoverageDeltas.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleGeneratorComparison.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleGeneratorComparison.tsx index b0cd5a9..9cb1e29 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleGeneratorComparison.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleGeneratorComparison.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx index e9ea165..fd4dd8b 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExamplePerformanceBenchmarks.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleSecurityFindings.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleSecurityFindings.tsx index de06261..9400a17 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleSecurityFindings.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleSecurityFindings.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStoreGeneratedTests.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStoreGeneratedTests.tsx index 9803431..7a919d4 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStoreGeneratedTests.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStoreGeneratedTests.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStrategyMetrics.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStrategyMetrics.tsx index e8df223..95b57cd 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStrategyMetrics.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleStrategyMetrics.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTestROI.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTestROI.tsx index 929d226..ebbb419 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTestROI.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTestROI.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTriageVerdicts.tsx b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTriageVerdicts.tsx index eeeec9c..4fae04a 100644 --- a/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTriageVerdicts.tsx +++ b/artifacts/ai-testing-lecture-9/src/pages/slides/WorkedExampleTriageVerdicts.tsx @@ -34,6 +34,8 @@ const codePanel: React.CSSProperties = { border: '1px solid #1E293B', padding: '3vh 2.4vw', fontFamily: "'SFMono-Regular', Menlo, Consolas, monospace", + direction: 'ltr', + textAlign: 'left', color: '#E2E8F0', width: '100%', height: '100%', diff --git a/tests/unit/lectureDecks.spec.ts b/tests/unit/lectureDecks.spec.ts index 09043e9..c3e8dd1 100644 --- a/tests/unit/lectureDecks.spec.ts +++ b/tests/unit/lectureDecks.spec.ts @@ -29,6 +29,50 @@ const deckNames = readdirSync(artifactsDir) const appSource = (deck: string): string => readFileSync(path.join(artifactsDir, deck, 'src', 'App.tsx'), 'utf8'); +/** Every slide component in a deck, as `[name, source]`. */ +function slideSources(deck: string): Array<[string, string]> { + const dir = path.join(artifactsDir, deck, 'src', 'pages', 'slides'); + return readdirSync(dir) + .filter(name => name.endsWith('.tsx')) + .map(name => [name, readFileSync(path.join(dir, name), 'utf8')]); +} + +/** + * A style object that sets a monospace family — a code panel, chip or line. + * + * No trailing comma is required: Prettier omits it on a single-line object, and + * requiring one is exactly how ten of these were missed the first time. + */ +const MONOSPACE = /fontFamily:\s*(?:"[^"]*monospace[^"]*"|'[^']*monospace[^']*')/g; + +/** + * The object literal that directly contains `index`, brace-balanced both ways, + * so a nested object cannot be mistaken for the declaration's own scope. + */ +function enclosingObject(source: string, index: number): string { + let depth = 0; + let start = -1; + for (let i = index - 1; i >= 0; i--) { + const c = source[i]; + if (c === '}') depth++; + else if (c === '{') { + if (depth === 0) { + start = i; + break; + } + depth--; + } + } + if (start === -1) return ''; + depth = 0; + for (let i = start; i < source.length; i++) { + const c = source[i]; + if (c === '{') depth++; + else if (c === '}' && --depth === 0) return source.slice(start, i + 1); + } + return ''; +} + /** The stage block, sliced out so the decks can be compared on it alone. */ function stageBlock(source: string): string | null { const start = source.indexOf('function stageDims'); @@ -74,6 +118,57 @@ test.describe('the stage logic', () => { }); }); +test.describe('code panels inside a right-to-left slide', () => { + /** + * A slide's root carries `dir={dir}`, which is `rtl` in Hebrew, and a code + * panel inside it used to inherit that. The bidi algorithm then resolved the + * trailing neutrals of a line — `():`, `()`, `)` — against an RTL paragraph + * and moved them to the front, so `def f():` rendered as `:()def f`. It is + * unreadable and it is wrong in every deck at once, because the panels are + * copy-shared. Code is left-to-right whatever the prose around it is, so the + * panel has to say so rather than inherit an answer. + */ + test('there are code panels to check', () => { + // Same reason as the deck count above: a regex that stops matching would + // turn the two assertions below green by iterating over nothing. + const total = deckNames.reduce( + (sum, deck) => + sum + slideSources(deck).reduce((n, [, src]) => n + [...src.matchAll(MONOSPACE)].length, 0), + 0, + ); + expect(total).toBeGreaterThanOrEqual(100); + }); + + test('every one of them sets its own direction', () => { + const offenders: string[] = []; + for (const deck of deckNames) { + for (const [name, source] of slideSources(deck)) { + for (const match of source.matchAll(MONOSPACE)) { + const block = enclosingObject(source, match.index!); + if (!/\bdirection:\s*'ltr'/.test(block)) offenders.push(`${deck}/${name}`); + } + } + } + expect(offenders, 'these code panels would inherit rtl from the slide').toEqual([]); + }); + + test('every one of them aligns left, whatever the slide around it does', () => { + // `direction` alone leaves `text-align: start`, which an ancestor's explicit + // `textAlign: 'right'` still overrides — several slides set exactly that on + // the column holding the panel. + const offenders: string[] = []; + for (const deck of deckNames) { + for (const [name, source] of slideSources(deck)) { + for (const match of source.matchAll(MONOSPACE)) { + const block = enclosingObject(source, match.index!); + if (!/\btextAlign:\s*'left'/.test(block)) offenders.push(`${deck}/${name}`); + } + } + } + expect(offenders, 'these code panels could be right-aligned').toEqual([]); + }); +}); + test.describe('the details that are easy to drop in a copy', () => { test('every deck rotates the stage on a narrow portrait viewport', () => { for (const deck of deckNames) { From c4601bc6d1e63dc8d07d3bb94d2744c79d3a80b7 Mon Sep 17 00:00:00 2001 From: Amiel Peled Date: Thu, 20 Aug 2026 14:19:53 +0300 Subject: [PATCH 2/6] fix(auth): run Replit API locally --- server/.replit-artifact/artifact.toml | 1 - server/tests/test_replit_deployment.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 server/tests/test_replit_deployment.py diff --git a/server/.replit-artifact/artifact.toml b/server/.replit-artifact/artifact.toml index aa33636..f2faaa6 100644 --- a/server/.replit-artifact/artifact.toml +++ b/server/.replit-artifact/artifact.toml @@ -26,7 +26,6 @@ args = ["uv", "run", "--project", "server", "uvicorn", "app.main:app", "--host", [services.production.run.env] PORT = "8080" NODE_ENV = "production" -UPSTREAM_API_BASE_URL = "https://ata-api.fly.dev" [services.production.health.startup] path = "/api/healthz" diff --git a/server/tests/test_replit_deployment.py b/server/tests/test_replit_deployment.py new file mode 100644 index 0000000..876ef25 --- /dev/null +++ b/server/tests/test_replit_deployment.py @@ -0,0 +1,12 @@ +import tomllib +from pathlib import Path + + +def test_replit_runs_the_api_locally_instead_of_relaying_to_an_absent_backend() -> None: + artifact_path = Path(__file__).parents[1] / ".replit-artifact" / "artifact.toml" + artifact = tomllib.loads(artifact_path.read_text(encoding="utf-8")) + + service = artifact["services"][0] + assert service["paths"] == ["/api"] + assert service["production"]["health"]["startup"]["path"] == "/api/healthz" + assert "UPSTREAM_API_BASE_URL" not in service["production"]["run"]["env"] From af63a74b1ca0c595190c52f1501352eebb725911 Mon Sep 17 00:00:00 2001 From: Amiel Peled Date: Thu, 20 Aug 2026 14:25:52 +0300 Subject: [PATCH 3/6] fix(deploy): exclude stale Replit API artifact --- .replitignore | 5 +++++ server/tests/test_replit_deployment.py | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/.replitignore b/.replitignore index 9eb019c..c0f99d4 100644 --- a/.replitignore +++ b/.replitignore @@ -3,3 +3,8 @@ # No need to store the pnpm store twice. .local + +# A removed Node API artifact can remain in an existing Replit workspace even +# though it is no longer tracked by Git. Excluding that legacy path prevents it +# from claiming /api and port 8080 ahead of the tracked FastAPI service. +artifacts/api-server diff --git a/server/tests/test_replit_deployment.py b/server/tests/test_replit_deployment.py index 876ef25..dc85599 100644 --- a/server/tests/test_replit_deployment.py +++ b/server/tests/test_replit_deployment.py @@ -10,3 +10,14 @@ def test_replit_runs_the_api_locally_instead_of_relaying_to_an_absent_backend() assert service["paths"] == ["/api"] assert service["production"]["health"]["startup"]["path"] == "/api/healthz" assert "UPSTREAM_API_BASE_URL" not in service["production"]["run"]["env"] + + +def test_replit_excludes_the_removed_node_api_artifact() -> None: + ignore_path = Path(__file__).parents[2] / ".replitignore" + ignored_paths = { + line.strip() + for line in ignore_path.read_text(encoding="utf-8").splitlines() + if line.strip() and not line.lstrip().startswith("#") + } + + assert "artifacts/api-server" in ignored_paths From d774556d8a95bc0809b28a1ffb47055eeac22eca Mon Sep 17 00:00:00 2001 From: Amiel Peled Date: Thu, 20 Aug 2026 14:32:00 +0300 Subject: [PATCH 4/6] fix(deploy): expose FastAPI as Replit artifact --- .replitignore | 5 ----- .../.replit-artifact/artifact.toml | 2 +- server/tests/test_replit_deployment.py | 19 +++++++------------ 3 files changed, 8 insertions(+), 18 deletions(-) rename {server => artifacts/api-server}/.replit-artifact/artifact.toml (89%) diff --git a/.replitignore b/.replitignore index c0f99d4..9eb019c 100644 --- a/.replitignore +++ b/.replitignore @@ -3,8 +3,3 @@ # No need to store the pnpm store twice. .local - -# A removed Node API artifact can remain in an existing Replit workspace even -# though it is no longer tracked by Git. Excluding that legacy path prevents it -# from claiming /api and port 8080 ahead of the tracked FastAPI service. -artifacts/api-server diff --git a/server/.replit-artifact/artifact.toml b/artifacts/api-server/.replit-artifact/artifact.toml similarity index 89% rename from server/.replit-artifact/artifact.toml rename to artifacts/api-server/.replit-artifact/artifact.toml index f2faaa6..476a349 100644 --- a/server/.replit-artifact/artifact.toml +++ b/artifacts/api-server/.replit-artifact/artifact.toml @@ -1,5 +1,5 @@ kind = "api" -previewPath = "/api" # TODO - should be excluded from preview in the first place +previewPath = "/api" title = "API Server" version = "1.0.0" id = "3B4_FFSkEVBkAeYMFRJ2e" diff --git a/server/tests/test_replit_deployment.py b/server/tests/test_replit_deployment.py index dc85599..30d8d28 100644 --- a/server/tests/test_replit_deployment.py +++ b/server/tests/test_replit_deployment.py @@ -3,21 +3,16 @@ def test_replit_runs_the_api_locally_instead_of_relaying_to_an_absent_backend() -> None: - artifact_path = Path(__file__).parents[1] / ".replit-artifact" / "artifact.toml" + artifact_path = ( + Path(__file__).parents[2] + / "artifacts" + / "api-server" + / ".replit-artifact" + / "artifact.toml" + ) artifact = tomllib.loads(artifact_path.read_text(encoding="utf-8")) service = artifact["services"][0] assert service["paths"] == ["/api"] assert service["production"]["health"]["startup"]["path"] == "/api/healthz" assert "UPSTREAM_API_BASE_URL" not in service["production"]["run"]["env"] - - -def test_replit_excludes_the_removed_node_api_artifact() -> None: - ignore_path = Path(__file__).parents[2] / ".replitignore" - ignored_paths = { - line.strip() - for line in ignore_path.read_text(encoding="utf-8").splitlines() - if line.strip() and not line.lstrip().startswith("#") - } - - assert "artifacts/api-server" in ignored_paths From 219ecbea3443bb1ea59702b5b54b81184c372a77 Mon Sep 17 00:00:00 2001 From: Amiel Peled Date: Thu, 20 Aug 2026 14:40:31 +0300 Subject: [PATCH 5/6] fix(deploy): set FastAPI import path --- artifacts/api-server/.replit-artifact/artifact.toml | 4 ++-- server/tests/test_replit_deployment.py | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/artifacts/api-server/.replit-artifact/artifact.toml b/artifacts/api-server/.replit-artifact/artifact.toml index 476a349..89b1b4b 100644 --- a/artifacts/api-server/.replit-artifact/artifact.toml +++ b/artifacts/api-server/.replit-artifact/artifact.toml @@ -10,7 +10,7 @@ name = "API Server" paths = ["/api"] [services.development] -run = "uv run --project server uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload" +run = "uv run --project server uvicorn app.main:app --app-dir server --host 0.0.0.0 --port 8080 --reload" [services.production] @@ -21,7 +21,7 @@ args = ["uv", "sync", "--project", "server", "--frozen", "--no-dev"] NODE_ENV = "production" [services.production.run] -args = ["uv", "run", "--project", "server", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"] +args = ["uv", "run", "--project", "server", "uvicorn", "app.main:app", "--app-dir", "server", "--host", "0.0.0.0", "--port", "8080"] [services.production.run.env] PORT = "8080" diff --git a/server/tests/test_replit_deployment.py b/server/tests/test_replit_deployment.py index 30d8d28..7f34e9a 100644 --- a/server/tests/test_replit_deployment.py +++ b/server/tests/test_replit_deployment.py @@ -14,5 +14,7 @@ def test_replit_runs_the_api_locally_instead_of_relaying_to_an_absent_backend() service = artifact["services"][0] assert service["paths"] == ["/api"] + run_args = service["production"]["run"]["args"] + assert run_args[run_args.index("--app-dir") + 1] == "server" assert service["production"]["health"]["startup"]["path"] == "/api/healthz" assert "UPSTREAM_API_BASE_URL" not in service["production"]["run"]["env"] From cab0b083ff2de3f03fa271af02919a6aba39a73c Mon Sep 17 00:00:00 2001 From: Amiel Peled Date: Thu, 20 Aug 2026 19:12:32 +0300 Subject: [PATCH 6/6] fix(deploy): run API from artifact directory --- artifacts/api-server/.replit-artifact/artifact.toml | 4 ++-- server/tests/test_replit_deployment.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/artifacts/api-server/.replit-artifact/artifact.toml b/artifacts/api-server/.replit-artifact/artifact.toml index 89b1b4b..8ff9fd5 100644 --- a/artifacts/api-server/.replit-artifact/artifact.toml +++ b/artifacts/api-server/.replit-artifact/artifact.toml @@ -10,7 +10,7 @@ name = "API Server" paths = ["/api"] [services.development] -run = "uv run --project server uvicorn app.main:app --app-dir server --host 0.0.0.0 --port 8080 --reload" +run = "cd ../../server && uv run uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload" [services.production] @@ -21,7 +21,7 @@ args = ["uv", "sync", "--project", "server", "--frozen", "--no-dev"] NODE_ENV = "production" [services.production.run] -args = ["uv", "run", "--project", "server", "uvicorn", "app.main:app", "--app-dir", "server", "--host", "0.0.0.0", "--port", "8080"] +args = ["sh", "-c", "cd ../../server && uv run uvicorn app.main:app --host 0.0.0.0 --port 8080"] [services.production.run.env] PORT = "8080" diff --git a/server/tests/test_replit_deployment.py b/server/tests/test_replit_deployment.py index 7f34e9a..6624fb3 100644 --- a/server/tests/test_replit_deployment.py +++ b/server/tests/test_replit_deployment.py @@ -15,6 +15,7 @@ def test_replit_runs_the_api_locally_instead_of_relaying_to_an_absent_backend() service = artifact["services"][0] assert service["paths"] == ["/api"] run_args = service["production"]["run"]["args"] - assert run_args[run_args.index("--app-dir") + 1] == "server" + assert run_args[:2] == ["sh", "-c"] + assert run_args[2].startswith("cd ../../server && uv run uvicorn app.main:app ") assert service["production"]["health"]["startup"]["path"] == "/api/healthz" assert "UPSTREAM_API_BASE_URL" not in service["production"]["run"]["env"]