diff --git a/.Jules/palette.md b/.Jules/palette.md new file mode 100644 index 000000000..fe71c7eee --- /dev/null +++ b/.Jules/palette.md @@ -0,0 +1,3 @@ +## 2026-08-10 - Added ARIA attributes to view selector role +**Learning:** When using custom UI components acting as a segmented control or radio group, apply appropriate semantic ARIA roles like `role="group"` on the container and `:aria-pressed` on the toggle buttons (since it's a group of toggle buttons changing the view mode) to ensure screen readers correctly interpret the state. Note that if `role="radiogroup"` was used, children would need `role="radio"` and `aria-checked`. +**Action:** Always add semantic roles and state attributes (`aria-pressed` or `aria-checked`) dynamically bound to their boolean properties for view mode selectors and segment controls. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d34fd0638..54eb42e45 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -83,16 +83,11 @@ jobs: - name: Install Playwright (chromium) run: npx playwright install --with-deps chromium - - name: Setup Supabase CLI - uses: supabase/setup-cli@v1 - with: - version: latest - - name: Boot Supabase + run two-client Realtime e2e (R1–R7) run: | - supabase start + npx supabase start ./scripts/run-e2e.sh canvas-sync-regressions.spec.ts --project=chromium --workers=2 - name: Stop Supabase if: always() - run: supabase stop || true + run: npx supabase stop || true diff --git a/scripts/run-e2e.sh b/scripts/run-e2e.sh index 2911c1d1f..30bd45364 100755 --- a/scripts/run-e2e.sh +++ b/scripts/run-e2e.sh @@ -6,7 +6,7 @@ set -euo pipefail # Auto-fetch keys from local Supabase if not already set -SUPABASE_STATUS_ENV="${SUPABASE_STATUS_ENV:-$(supabase status -o env 2>&1 || true)}" +SUPABASE_STATUS_ENV="${SUPABASE_STATUS_ENV:-$(npx supabase status -o env 2>&1 || true)}" if [ -z "${SUPABASE_SERVICE_ROLE_KEY:-}" ]; then # Try new-format secret key first (Supabase v2.x uses sb_secret_* instead of HS256 JWT) @@ -27,7 +27,7 @@ if [ -z "${VITE_SUPABASE_ANON_KEY:-}" ]; then fi if [ -z "${SUPABASE_SERVICE_ROLE_KEY:-}" ] || [ -z "${VITE_SUPABASE_ANON_KEY:-}" ]; then - echo "ERROR: Could not fetch Supabase keys. Is local Supabase running? (supabase start)" + echo "ERROR: Could not fetch Supabase keys. Is local Supabase running? (npx supabase start)" exit 1 fi diff --git a/src/components/QuickSortCard.vue b/src/components/QuickSortCard.vue index aa9be96fa..6be98a4ea 100644 --- a/src/components/QuickSortCard.vue +++ b/src/components/QuickSortCard.vue @@ -85,10 +85,10 @@ defineProps<{ }>() const emit = defineEmits<{ - (e: 'swipe-right'): void - (e: 'swipe-left'): void - (e: 'swipe-up'): void - (e: 'swipe-down'): void + (e: 'swipeRight'): void + (e: 'swipeLeft'): void + (e: 'swipeUp'): void + (e: 'swipeDown'): void }>() const cardRef = ref(null) @@ -105,10 +105,10 @@ const { haptics: true, fourDirectional: true, mouse: true, - onSwipeRight: () => emit('swipe-right'), - onSwipeLeft: () => emit('swipe-left'), - onSwipeUp: () => emit('swipe-up'), - onSwipeDown: () => emit('swipe-down') + onSwipeRight: () => emit('swipeRight'), + onSwipeLeft: () => emit('swipeLeft'), + onSwipeUp: () => emit('swipeUp'), + onSwipeDown: () => emit('swipeDown') }) // Card transform style - supports both horizontal and vertical movement diff --git a/src/components/ai/AIMemoryHealthDashboard.vue b/src/components/ai/AIMemoryHealthDashboard.vue index 11249bade..d8c7df6d6 100644 --- a/src/components/ai/AIMemoryHealthDashboard.vue +++ b/src/components/ai/AIMemoryHealthDashboard.vue @@ -36,13 +36,17 @@ -
{{ error }}
+
+ {{ error }} +

Memory Grade

-
{{ report.grade }}
+
+ {{ report.grade }} +

{{ gradeLabel }}

@@ -56,13 +60,17 @@

Sections

-
{{ report.sections.length }}
+
+ {{ report.sections.length }} +

{{ report.mode === 'full' ? 'Full assessment' : 'Quick check' }}

Duration

-
{{ formatDuration(report.durationMs) }}
+
+ {{ formatDuration(report.durationMs) }} +

{{ formatTime(report.timestamp) }}

@@ -70,7 +78,9 @@

No assessment results yet.

-

"Quick Check" runs heuristic tests instantly. "Full Assessment" adds LLM-as-judge context utilization tests (~30s).

+

+ "Quick Check" runs heuristic tests instantly. "Full Assessment" adds LLM-as-judge context utilization tests (~30s). +

@@ -115,7 +125,9 @@ {{ check.name }} {{ check.score }}% -
{{ check.value }}
+
+ {{ check.value }} +
{{ check.recommendation }}
@@ -160,7 +172,9 @@ {{ formatTime(h.timestamp) }} - + diff --git a/src/components/ai/ChatMessage.vue b/src/components/ai/ChatMessage.vue index a47ce2aaf..79dd723ff 100644 --- a/src/components/ai/ChatMessage.vue +++ b/src/components/ai/ChatMessage.vue @@ -2586,13 +2586,17 @@ async function saveSchedule() { data-testid="ai-clarification" >
-
{{ clarification.progressLabel }}
+
+ {{ clarification.progressLabel }} +

{{ clarification.locale === 'he' ? 'שאלה קצרה לפני התכנון' : 'Quick question before planning' }}

{{ clarification.summary }}

{{ clarification.locale === 'he' ? 'למה אני שואל?' : 'Why ask?' }}
    -
  • {{ line }}
  • +
  • + {{ line }} +
@@ -2781,7 +2785,9 @@ async function saveSchedule() {

{{ weeklyPlan.headline }}

{{ weeklyPlan.weekRead.summary }}

-

{{ weeklyPlan.weekRead.mainTradeoff }}

+

+ {{ weeklyPlan.weekRead.mainTradeoff }} +

{{ weeklyPlan.locale === 'he' ? 'נתיב' : 'Lane' }} -

{{ weeklyLaneTitle(rec) }}

-

{{ weeklyLaneSubtitle(rec) }}

+

+ {{ weeklyLaneTitle(rec) }} +

+

+ {{ weeklyLaneSubtitle(rec) }} +