diff --git a/.Jules/palette.md b/.Jules/palette.md new file mode 100644 index 000000000..f72f7745e --- /dev/null +++ b/.Jules/palette.md @@ -0,0 +1,3 @@ +## 2024-05-24 - Accessibility When Hiding Elements Visually Responsively +**Learning:** When using CSS rules like `display: none` to hide text labels within buttons responsively (e.g. shrinking tabs to icon-only on mobile screens), screen readers will also fail to read the inner text, effectively turning them into inaccessible icon-only buttons for visually impaired users. +**Action:** Always ensure that buttons which may have their visual text label hidden dynamically via CSS also have a corresponding dynamic `aria-label` or `title` bound to the parent button element to guarantee persistent accessibility across all screen sizes. 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/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/AIQualityDashboard.vue b/src/components/ai/AIQualityDashboard.vue index 588d50c81..1af29adec 100644 --- a/src/components/ai/AIQualityDashboard.vue +++ b/src/components/ai/AIQualityDashboard.vue @@ -10,8 +10,8 @@ @@ -45,7 +45,9 @@

Overall Grade

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

{{ gradeLabel }}

@@ -67,14 +69,18 @@

Provider

-
{{ report.provider }}
+
+ {{ report.provider }} +

{{ formatTime(report.timestamp) }}

-

AI Quality Assessment

+

+ AI Quality Assessment +

Tests your AI assistant by sending {{ testPrompts.length }} prompts across {{ new Set(testPrompts.map(t => t.category)).size }} categories, then judges each response against {{ rubrics.length }} quality rubrics using a second LLM call. @@ -129,7 +135,7 @@ {{ result.grade }} - +

@@ -142,7 +148,9 @@
AI Response: -
{{ result.response }}
+
+ {{ result.response }} +
@@ -154,12 +162,16 @@

Full AI Response

-
{{ result.response }}
+
+ {{ result.response }} +

Judge's Detailed Assessment

-
{{ result.judgeReasoning }}
+
+ {{ result.judgeReasoning }} +
@@ -260,7 +272,9 @@ {{ formatTime(h.timestamp) }}
- + diff --git a/src/components/ai/AISetupWizard.vue b/src/components/ai/AISetupWizard.vue index 7c13c820e..810aebff2 100644 --- a/src/components/ai/AISetupWizard.vue +++ b/src/components/ai/AISetupWizard.vue @@ -25,7 +25,9 @@
-

Set up AI

+

+ Set up AI +

FlowState uses AI for smart suggestions, task analysis, and chat. Choose how you'd like to power it. @@ -37,7 +39,9 @@ :class="{ selected: chosenProvider === 'groq' }" @click="chosenProvider = 'groq'" > -

+ Groq Cloud @@ -70,7 +74,9 @@
-

Connect Groq

+

+ Connect Groq +

Groq offers free AI API access with generous daily limits. Create a free account and paste your API key below. @@ -90,13 +96,13 @@

+ >