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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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', 'טבלה')}
-
@@ -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) {