diff --git a/.jules/palette.md b/.jules/palette.md
new file mode 100644
index 0000000..e9e6383
--- /dev/null
+++ b/.jules/palette.md
@@ -0,0 +1,3 @@
+## 2025-02-18 - Missing Alerts for Dynamic Status
+**Learning:** The application uses `framer-motion` for dynamic feedback messages but consistently lacks `role="alert"` and `aria-live` attributes, causing screen readers to miss critical status updates.
+**Action:** When auditing forms, check all `motion.div/p` elements used for feedback and add `role="alert"` and `aria-live="polite"` (or "assertive" for errors).
diff --git a/src/pages/Contact.tsx b/src/pages/Contact.tsx
index 708d7c8..79c91c4 100644
--- a/src/pages/Contact.tsx
+++ b/src/pages/Contact.tsx
@@ -210,6 +210,8 @@ export function Contact() {
className={styles.success}
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
+ role="alert"
+ aria-live="polite"
>
{t.contact.form.success}
@@ -220,6 +222,8 @@ export function Contact() {
className={styles.error}
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
+ role="alert"
+ aria-live="polite"
>
{t.contact.form.error}
@@ -230,6 +234,8 @@ export function Contact() {
className={styles.error}
initial={{ opacity: 0, y: 10 }}
animate={{ opacity: 1, y: 0 }}
+ role="alert"
+ aria-live="polite"
>
{t.contact.form.rateLimit}
@@ -254,6 +260,7 @@ export function Contact() {
fill="none"
stroke="currentColor"
strokeWidth="2"
+ aria-hidden="true"
>