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/server/.replit-artifact/artifact.toml b/artifacts/api-server/.replit-artifact/artifact.toml similarity index 60% rename from server/.replit-artifact/artifact.toml rename to artifacts/api-server/.replit-artifact/artifact.toml index aa33636..8ff9fd5 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" @@ -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 = "cd ../../server && uv run uvicorn app.main:app --host 0.0.0.0 --port 8080 --reload" [services.production] @@ -21,12 +21,11 @@ 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 = ["sh", "-c", "cd ../../server && uv run uvicorn app.main:app --host 0.0.0.0 --port 8080"] [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..6624fb3 --- /dev/null +++ b/server/tests/test_replit_deployment.py @@ -0,0 +1,21 @@ +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[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"] + run_args = service["production"]["run"]["args"] + 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"] 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) {