Matches below use the average RI ({doubleReadingResult.lookupRI.toFixed(3)}) ± {values.tolerance}.
diff --git a/src/components/calculator/SGCalculator.tsx b/src/components/calculator/SGCalculator.tsx
index c3574aa..0d05deb 100644
--- a/src/components/calculator/SGCalculator.tsx
+++ b/src/components/calculator/SGCalculator.tsx
@@ -28,7 +28,7 @@ const WATER_DENSITY_TABLE: { tempC: number; density: number }[] = [
const TEMP_OPTIONS = [
{ value: '20', label: '20 °C (room temperature, default)' },
- { value: '4', label: '4 °C (max density — ideal but cold)' },
+ { value: '4', label: '4 °C (max density, ideal but cold)' },
{ value: '15', label: '15 °C (cool tap water)' },
{ value: '25', label: '25 °C (warm room)' },
{ value: '30', label: '30 °C (warm)' },
diff --git a/src/components/identification/HardnessReference.tsx b/src/components/identification/HardnessReference.tsx
index c4f74da..a34398d 100644
--- a/src/components/identification/HardnessReference.tsx
+++ b/src/components/identification/HardnessReference.tsx
@@ -22,16 +22,16 @@ interface GemHardness {
}
const MOHS_SCALE: MohsLevel[] = [
- { hardness: 10, mineral: 'Diamond', wearResistance: 'Excellent for all jewelry' },
- { hardness: 9, mineral: 'Corundum (Ruby/Sapphire)', wearResistance: 'Excellent for all jewelry' },
+ { hardness: 10, mineral: 'Diamond', wearResistance: 'Excellent for all jewellery' },
+ { hardness: 9, mineral: 'Corundum (Ruby/Sapphire)', wearResistance: 'Excellent for all jewellery' },
{ hardness: 8, mineral: 'Topaz / Spinel', wearResistance: 'Excellent for daily wear' },
- { hardness: 7.5, mineral: 'Beryl (Emerald / Aquamarine)', wearResistance: 'Good for most jewelry' },
- { hardness: 7, mineral: 'Quartz', wearResistance: 'Good for most jewelry' },
+ { hardness: 7.5, mineral: 'Beryl (Emerald / Aquamarine)', wearResistance: 'Good for most jewellery' },
+ { hardness: 7, mineral: 'Quartz', wearResistance: 'Good for most jewellery' },
{ hardness: 6.5, mineral: 'Tanzanite / Peridot', wearResistance: 'Fair: avoid rings' },
{ hardness: 6, mineral: 'Feldspar (Moonstone)', wearResistance: 'Fair: pendants/earrings' },
{ hardness: 5, mineral: 'Apatite', wearResistance: 'Poor: collector only' },
{ hardness: 4, mineral: 'Fluorite', wearResistance: 'Poor: collector only' },
- { hardness: 3, mineral: 'Calcite', wearResistance: 'Not suitable for jewelry' },
+ { hardness: 3, mineral: 'Calcite', wearResistance: 'Not suitable for jewellery' },
];
// Fallback data if database is unavailable
diff --git a/src/components/lab/SpectroscopeBandMatcher.tsx b/src/components/lab/SpectroscopeBandMatcher.tsx
index 70d7171..8edcbfd 100644
--- a/src/components/lab/SpectroscopeBandMatcher.tsx
+++ b/src/components/lab/SpectroscopeBandMatcher.tsx
@@ -92,7 +92,7 @@ export function SpectroscopeBandMatcher() {
className={`text-xs px-2.5 py-1 rounded font-mono border transition ${
isOn ? `${swatch} border-slate-700 ring-2 ring-slate-400` : `${swatch} border-transparent opacity-60 hover:opacity-100`
}`}
- title={`${wl} nm — ${colourFor(wl)} region`}
+ title={`${wl} nm, ${colourFor(wl)} region`}
>
{wl} nm
diff --git a/src/components/optical/OpticSignReasoner.tsx b/src/components/optical/OpticSignReasoner.tsx
index 8cf08b3..426bda0 100644
--- a/src/components/optical/OpticSignReasoner.tsx
+++ b/src/components/optical/OpticSignReasoner.tsx
@@ -189,10 +189,10 @@ export function OpticSignReasoner() {
{character === 'uniaxial' && (
-
+
-
+
-
+
@@ -244,7 +244,7 @@ export function OpticSignReasoner() {
{/* Candidate list */}
{dbError && (
- Database unavailable — candidate ranking disabled. ({dbError})
+ Database unavailable; candidate ranking is disabled. ({dbError})
)}
{loading ? (
diff --git a/src/components/optical/PleochroismReasoner.tsx b/src/components/optical/PleochroismReasoner.tsx
index 03e36c2..06b5a43 100644
--- a/src/components/optical/PleochroismReasoner.tsx
+++ b/src/components/optical/PleochroismReasoner.tsx
@@ -20,9 +20,9 @@ import { usePagination } from '../../hooks/usePagination';
import { Pagination } from '../ui';
const COLOUR_COUNT_OPTIONS = [
- { value: '1', label: '1 — single colour' },
- { value: '2', label: '2 — dichroic' },
- { value: '3', label: '3 — trichroic' },
+ { value: '1', label: '1: single colour' },
+ { value: '2', label: '2: dichroic' },
+ { value: '3', label: '3: trichroic' },
];
const STRENGTH_OPTIONS: { value: PleochroismStrength; label: string }[] = [
diff --git a/src/components/optical/PolariscopeGuide.tsx b/src/components/optical/PolariscopeGuide.tsx
index 44f4942..8397d6d 100644
--- a/src/components/optical/PolariscopeGuide.tsx
+++ b/src/components/optical/PolariscopeGuide.tsx
@@ -142,7 +142,7 @@ export function PolariscopeGuide() {
• If no reaction at all, check polarizers are properly crossed
• Weak reactions may need immersion fluid to reduce surface reflections
- • Multiple orientations needed for comprehensive testing
+ • Multiple orientations needed for thorough testing
• Clean polarizers and stone surface for best results
diff --git a/src/components/quiz/study/ConfidenceTap.tsx b/src/components/quiz/study/ConfidenceTap.tsx
index b988140..537d361 100644
--- a/src/components/quiz/study/ConfidenceTap.tsx
+++ b/src/components/quiz/study/ConfidenceTap.tsx
@@ -113,7 +113,7 @@ export function ConfidenceTap({ value, onChange, disabled = false }: ConfidenceT
type="button"
role="radio"
aria-checked={isSelected}
- aria-label={`${opt.label} — ${opt.description}`}
+ aria-label={`${opt.label}: ${opt.description}`}
disabled={disabled}
onClick={() => onChange(opt.value)}
className={cn(
diff --git a/src/components/quiz/study/ExportImportPanel.tsx b/src/components/quiz/study/ExportImportPanel.tsx
index 28689e4..e953f6d 100644
--- a/src/components/quiz/study/ExportImportPanel.tsx
+++ b/src/components/quiz/study/ExportImportPanel.tsx
@@ -87,7 +87,7 @@ export function ExportImportPanel({ store }: ExportImportPanelProps) {
} else {
showToast({
kind: 'error',
- message: result.warnings[0] ?? 'Import failed — the file may be invalid.',
+ message: result.warnings[0] ?? 'Import failed. The file may be invalid.',
});
}
} catch {
diff --git a/src/components/quiz/study/LearnQuizWidget.tsx b/src/components/quiz/study/LearnQuizWidget.tsx
index 6d15f22..672682a 100644
--- a/src/components/quiz/study/LearnQuizWidget.tsx
+++ b/src/components/quiz/study/LearnQuizWidget.tsx
@@ -192,7 +192,7 @@ export function LearnQuizWidget({
: undefined;
return (
-
+
{
expect(screen.getByText('Great diagnostic chain.')).toBeInTheDocument();
});
- it('shows "Correct — here is why" heading when correct=true', () => {
+ it('shows "Correct: here is why" heading when correct=true', () => {
render(
,
);
- expect(screen.getByText(/correct — here is why/i)).toBeInTheDocument();
+ expect(screen.getByText(/correct: here is why/i)).toBeInTheDocument();
});
- it('shows "Not quite — here is why" heading when correct=false', () => {
+ it('shows "Not quite: here is why" heading when correct=false', () => {
render(
,
);
- expect(screen.getByText(/not quite — here is why/i)).toBeInTheDocument();
+ expect(screen.getByText(/not quite: here is why/i)).toBeInTheDocument();
});
// ── Collapse / expand ──────────────────────────────────────────────────────
diff --git a/src/components/quiz/study/RationalePanel.tsx b/src/components/quiz/study/RationalePanel.tsx
index 91129c9..e6cc178 100644
--- a/src/components/quiz/study/RationalePanel.tsx
+++ b/src/components/quiz/study/RationalePanel.tsx
@@ -101,7 +101,7 @@ export function RationalePanel({
) : (
)}
- {correct ? 'Correct — here is why' : 'Not quite — here is why'}
+ {correct ? 'Correct: here is why' : 'Not quite: here is why'}
{expanded ? (
@@ -152,7 +152,7 @@ export function RationalePanel({
? 'text-red-600 dark:text-red-400'
: 'text-slate-600 dark:text-slate-600',
)}
- aria-label={wasChosen ? 'Your choice — incorrect' : 'Incorrect option'}
+ aria-label={wasChosen ? 'Your choice, incorrect' : 'Incorrect option'}
/>
)}
diff --git a/src/components/quiz/study/ScheduleBadge.test.tsx b/src/components/quiz/study/ScheduleBadge.test.tsx
index 2f3fd52..6d86015 100644
--- a/src/components/quiz/study/ScheduleBadge.test.tsx
+++ b/src/components/quiz/study/ScheduleBadge.test.tsx
@@ -34,7 +34,7 @@ describe('ScheduleBadge', () => {
it('"New" badge has an appropriate aria-label', () => {
render(
);
- expect(screen.getByLabelText(/new — never seen before/i)).toBeInTheDocument();
+ expect(screen.getByLabelText(/new, never seen before/i)).toBeInTheDocument();
});
// ── Due state ─────────────────────────────────────────────────────────────
diff --git a/src/components/quiz/study/ScheduleBadge.tsx b/src/components/quiz/study/ScheduleBadge.tsx
index f7f3fdf..e0eb4a9 100644
--- a/src/components/quiz/study/ScheduleBadge.tsx
+++ b/src/components/quiz/study/ScheduleBadge.tsx
@@ -28,7 +28,7 @@ export function ScheduleBadge({ entry, now: nowOverride }: ScheduleBadgeProps) {
if (!entry || entry.totalReviews === 0) {
return (
-
+
New
);
diff --git a/src/components/quiz/study/StudyDevHarness.tsx b/src/components/quiz/study/StudyDevHarness.tsx
index c04f4a8..f0a5705 100644
--- a/src/components/quiz/study/StudyDevHarness.tsx
+++ b/src/components/quiz/study/StudyDevHarness.tsx
@@ -86,12 +86,12 @@ const OPTION_RATIONALES: OptionRationale[] = [
{
text: 'Natural ruby (corundum)',
isCorrect: true,
- rationale: 'RI 1.762–1.770, SG 4.00, uniaxial negative — all diagnostic of corundum.',
+ rationale: 'RI 1.762–1.770, SG 4.00, uniaxial negative: all diagnostic of corundum.',
},
{
text: 'Spinel',
isCorrect: false,
- rationale: 'Spinel is isotropic (single RI ≈ 1.718) — no uniaxial reading possible.',
+ rationale: 'Spinel is isotropic (single RI ≈ 1.718); no uniaxial reading possible.',
},
{
text: 'Pyrope garnet',
@@ -118,7 +118,7 @@ const MOCK_QUESTIONS: WidgetQuestion[] = [
correctAnswer: 'Cubic',
rationaleCorrect: 'Diamond crystallises in the cubic (isometric) system with point group m3m.',
optionRationales: [
- { text: 'Cubic', isCorrect: true, rationale: 'Correct — m3m symmetry.' },
+ { text: 'Cubic', isCorrect: true, rationale: 'Correct: m3m symmetry.' },
{ text: 'Hexagonal', isCorrect: false, rationale: '6-fold symmetry axis; does not apply to diamond.' },
{ text: 'Trigonal', isCorrect: false, rationale: '3-fold symmetry; quartz and corundum, not diamond.' },
],
@@ -174,7 +174,7 @@ function InteractiveConfidenceTap() {
- Selected: {value ?? 'null'} — try keyboard Q/W/E
+ Selected: {value ?? 'null'}. Try keyboard Q/W/E.
);
@@ -203,7 +203,7 @@ export function StudyDevHarness() {
return (
- Study Components — Dev Harness
+ Study Components: Dev Harness
Only served in development (import.meta.env.DEV). All components rendered
with mocked data.
@@ -228,7 +228,7 @@ export function StudyDevHarness() {
{}} disabled={true} />
-
+
@@ -320,10 +320,10 @@ export function StudyDevHarness() {
{/* ── ExportImportPanel ─────────────────────────────────────────────── */}
-
+
-
+
@@ -332,7 +332,7 @@ export function StudyDevHarness() {
{/* ── LearnQuizWidget ───────────────────────────────────────────────── */}
-
+
Review
- Spaced-repetition queue — items the scheduler says you should see today.
+ Spaced-repetition queue: items the scheduler says you should see today.
@@ -86,7 +86,7 @@ function EmptyReviewState() {
Nothing due right now
- Your spaced-repetition queue is empty — every item you've seen is still
+ Your spaced-repetition queue is empty; every item you've seen is still
within its scheduled interval. Practice new questions to grow the queue.